一、使浏览器不缓存页面的过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用于的使 Browser 不缓存页面的过滤器
*/
public class ForceNoCacheFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);
filterChain.doFilter(request, response);
}
public void destroy() { }
public void init(FilterConfig filterConfig) throws ServletException { }
}
二、检测用户是否登陆的过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.IOException;
/**
* 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面
* 配置参数
* checkSessionKey 需检查的在 Session 中保存的关键字
* redirectURL 如果用户未登录,则重定向到指定的页面,URL不包括 ContextPath
* notCheckURLList 不做检查的URL列表,以分号分开,并且 URL 中不包括 ContextPath
*/
public class CheckLoginFilter implements Filter {
protected FilterConfig filterConfig = null;
private String redirectURL = null;
private List notCheckURLList = new ArrayList();
private String sessionKey = null;
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if(sessionKey == null) {
filterChain.doFilter(request, response);
return;
}
if((!checkRequestURIIntNotFilterList(request)) && session.getAttribute(sessionKey) == null) {
response.sendRedirect(request.getContextPath() + redirectURL);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
notCheckURLList.clear();
}
private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {
String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo());
return notCheckURLList.contains(uri);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
redirectURL = filterConfig.getInitParameter("redirectURL");
sessionKey = filterConfig.getInitParameter("checkSessionKey");
String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList");
if(notCheckURLListStr != null) {
StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";");
notCheckURLList.clear();
while(st.hasMoreTokens()) {
notCheckURLList.add(st.nextToken());
}
}
}
}
三、字符编码的过滤器
import javax.servlet.*;
import java.io.IOException;
/**
* 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,用于处理Html Form请求参数的中文问题
*/
public class CharacterEncodingFilter implements Filter {
protected FilterConfig filterConfig = null;
protected String encoding = "";
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if(encoding != null)
servletRequest.setCharacterEncoding(encoding);
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
filterConfig = null;
encoding = null;
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
}
四、资源保护过滤器
package catalog.view.util;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class SecurityFilter implements Filter {
//the login page uri
private static final String LOGIN_PAGE_URI = "login.jsf";
//the logger object
private Log logger = LogFactory.getLog(this.getClass());
//a set of restricted resources
private Set restrictedResources;
/**
* Initializes the Filter.
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.restrictedResources = new HashSet();
this.restrictedResources.add("/createProduct.jsf");
this.restrictedResources.add("/editProduct.jsf");
this.restrictedResources.add("/productList.jsf");
}
/**
* Standard doFilter object.
*/
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
this.logger.debug("doFilter");
String contextPath = ((HttpServletRequest)req).getContextPath();
String requestUri = ((HttpServletRequest)req).getRequestURI();
this.logger.debug("contextPath = " + contextPath);
this.logger.debug("requestUri = " + requestUri);
if (this.contains(requestUri, contextPath) && !this.authorize((HttpServletRequest)req)) {
this.logger.debug("authorization failed");
((HttpServletRequest)req).getRequestDispatcher(LOGIN_PAGE_URI).forward(req, res);
} else {
this.logger.debug("authorization succeeded");
chain.doFilter(req, res);
}
}
public void destroy() {}
private boolean contains(String value, String contextPath) {
Iterator ite = this.restrictedResources.iterator();
while (ite.hasNext()) {
String restrictedResource = (String)ite.next();
if ((contextPath + restrictedResource).equalsIgnoreCase(value)) {
return true;
}
}
return false;
}
private boolean authorize(HttpServletRequest req) {
//处理用户登录
/* UserBean user = (UserBean)req.getSession().getAttribute(BeanNames.USER_BEAN);
if (user != null && user.getLoggedIn()) {
//user logged in
return true;
} else {
return false;
}*/
}
}
Servlet过滤器是一个Web应用组件,和Servlet类似,也需要在Web应用配置文件中进行配置:首先是过滤器的Web应用定义包含在<filter>…</filer>元素中,其次是Web应用的过滤器映射配置文件<filter-mapping>…</filter-mapping>
过滤器的应用很广泛,在这里介绍利用过滤器进行中文转码。一般在JavaWeb应用中,当利用request.getParameter(String str)方法获取从表单或是页面传过来的中文参数都会是一个乱码。通常会采用如下的转码方式在Servlet或是JSP中进行转码设置:
(1)request.setCharacterEncoding("gb2312");
(2)String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"), "GB2312");
假设:一个表单有多数据传到Servlet或是JSP,那么就可能在这些Servlet或是JSP中写下多个request.setCharacterEncoding("gb2312")或是多个类似于String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"), "GB2312");这样子肯定加大代码工作量。
针对上面的一些常见的问题,下面利用过滤器进行中文转码就可以迎刃而解。配置Filter的步骤如下:
(1)现在web.xml文件中配置如下信息
- <filter>
- <filter-name>CharactsetConversion</filter-name>
- <filter-class>com.gxa.edu.servlet.CharactsetConversion</filter-class>
- <init-param>
- <param-name>flag</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>charcode</param-name>
- <param-value>gb2312</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <!-- 配置需要过滤的URL,这里主要是对所有的文件进行过滤 -->
- <filter-name>CharactsetConversion</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
当配置好web.xml文件后,就创建一个过滤器类,名称CharactsetConversion,该类必须实现Filter接口,同时Filter接口提供了3个方法
(1)void doFilter(ServletRequest req,ServletResponse res,FilterChain filterChain)
(2)void init(FilterConfig filterConfig)
(3)void destroy()
(2)创建一个CharactsetConversion.java文件,该文件了实现Filter接口
- package com.gxa.edu.servlet;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- public class CharactsetConversion implements Filter{
- private FilterConfig filterConfig = null;
- private boolean flag = true;
- private String charcode = "gb2312";
- public void init(FilterConfig filterConfig) {
- this.filterConfig = filterConfig;
- String temp = this.filterConfig.getInitParameter("flag");
- String str = this.filterConfig.getInitParameter("charcode");
- if(temp != null){
- if(temp.equals("true")){
- this.flag = true;
- }else if(temp.equals("false")){
- this.flag = false;
- }else{
- this.flag = true;
- }
- }
- if(str != null){
- this.charcode = str;
- }
- }
- public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain) {
- try {
- if (flag) {
- String c = request.getCharacterEncoding();
- if (c == null) {
- request.setCharacterEncoding(charcode);
- } else if (!c.equals(this.charcode)) {
- request.setCharacterEncoding(charcode);
- }
- }
- filterChain.doFilter(request, response);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void destroy() {
- this.filterConfig = null;
- }
- }
过滤器配置
1。如果要映射过滤应用程序中所有资源:
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.过滤指定的类型文件资源
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
其中<url-pattern>*.html</url-pattern>要过滤jsp那么就改*.html为*.jsp,但是注意没有“/”斜杠
如果要同时过滤多种类型资源:
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
3.过滤指定的目录
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>/folder_name/*</url-pattern>
</filter-mapping>
4.过滤指定的servlet
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<servlet-name>loggerservlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>loggerservlet</servlet-name>
<servlet-class>myfilter.LoggerServlet</servlet-class>
</servlet>
5.过滤指定文件
<filter>
<filter-name>loggerfilter</filter-name>
<filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggerfilter</filter-name>
<url-pattern>/simplefilter.html</url-pattern>
</filter-mapping>
以上都要注意是否有斜杠“/”
相关推荐
下面我们将详细讨论Filter的工作原理以及`UserRoleFilter`如何实现页面访问权限控制: 1. **Filter生命周期**: - **初始化**:当Filter被加载时,会调用`init(FilterConfig filterConfig)`方法。在这个方法中,`...
在Java Web开发中,访问权限控制是至关重要的一个环节,它确保了只有具有相应权限的用户才能访问特定的资源或执行特定的操作。本示例主要通过Filter技术来实现这一功能,这是一种常见且实用的方法。 首先,我们需要...
在这个场景中,"Filter进行权限控制"指的是使用`Filter`来实现用户访问权限的管理,确保只有登录后的用户才能访问特定的资源。下面我们将深入探讨`Filter`的工作原理以及如何实现登录控制。 `Filter`是Java Servlet...
通过以上步骤,我们可以实现一个基于RBAC的权限控制系统,利用`Filter`对用户请求进行拦截,确保只有拥有相应角色的用户才能访问特定的页面或功能。这种方式既提高了系统的安全性,也简化了权限管理的复杂度。 在...
- **跳转到页面**:这种情况下,如果用户尝试访问无权限的资源,通常的做法是将其重定向至提示没有权限的页面。 - **返回Json数据**:如果用户的请求是Ajax请求,则期望在没有权限的情况下返回一个JSON格式的数据,...
同时,可以利用Spring Security的`@PreAuthorize`或`@Secured`注解来控制菜单链接的访问权限。 2. **元素控制**:元素控制是指对页面上的具体组件或操作按钮进行权限控制。例如,只有特定角色的用户才能看到某个...
**JSP权限管理系统filter**是基于Java和JSP技术实现的一种常见的Web应用程序安全控制机制,主要目的是为了实现用户访问控制,防止未授权的用户访问敏感资源。在这个系统中,Filter(过滤器)扮演了关键角色,它在...
<filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/myresource/*</url-pattern> </...
例如,一个只允许管理员访问的页面,可以在控制器方法上添加`@RequiresRoles("admin")`注解。 通过以上步骤,你就可以在Spring中成功集成Shiro并实现动态URL权限控制了。这不仅提高了代码的可维护性,还使得权限...
4. **决策逻辑**:如果用户具有访问权限,过滤器允许请求继续,否则,它将阻止请求并返回错误页面或提示。 5. **日志记录**:为了追踪和调试,过滤器可能会记录用户的尝试访问行为,包括成功和失败的请求。 6. **...
// 检查用户是否有访问权限 if (user == null || !user.hasPermissionToAccess("/protected/somePage")) { // 如果无权访问,重定向或返回错误信息 ((HttpServletResponse) response).sendRedirect("/login"); ...
2. **配置Filter**:在`web.xml`中配置`Filter`,包括定义`<filter>`、`<filter-mapping>`元素,指定过滤器的类名以及需要拦截的URL模式。 3. **Filter链**:多个`Filter`可以串联形成一个`Filter Chain`,按照配置...
过滤器(Filter)技术常被用来实现多层权限控制,确保只有合法的用户才能访问特定的资源。本文将深入探讨如何利用过滤器实现多层权限控制,并结合给定的标签“源码”和“工具”,来提供一个具体的实践示例。 首先,...
在IT行业中,过滤器...通过编写和配置Filter,开发者可以灵活地实现各种定制化的权限策略,确保只有合法用户才能访问特定的Web资源。在实际项目中,应根据业务需求选择合适的过滤策略和工具,以达到最佳的安全效果。
<filter-name>UserAccessFilter</filter-name> <filter-class>com.example.filter.UserAccessFilter</filter-class> </filter> <filter-mapping> <filter-name>UserAccessFilter</filter-name> <url-pattern>/...
在Java Web开发中,权限控制是一项至关重要的任务,它确保只有授权的用户才能访问特定的资源和服务。这里的“java权限控制”主要指的是在Web应用程序中实施的安全策略,以保护敏感数据和操作。过滤器(Filter)是...
例如,`<filter-mapping>`标签可以将Filter关联到所有需要授权的页面。 4. **使用EL进行权限检查**:在JSP页面中,可以使用EL表达式检查用户角色或权限,根据结果动态展示内容。例如,`${not empty sessionScope....
在IT行业中,尤其是在Web开发领域,用户认证与授权是至关重要的环节。...同时,对RBAC的理解和应用也是系统管理员和开发者必备的技能之一,因为它能有效地管理和控制系统的访问权限,防止未经授权的访问。
3. **实现权限检查**:在`isUserAuthorized()`方法中,我们可以根据业务逻辑检查用户是否具有访问权限。这通常涉及到从HTTP session中获取用户信息,然后比较用户的角色或权限与所需访问资源的访问级别。 4. **处理...
<filter-name>AdminFilter</filter-name> <!--配置 filter 的全类名--> <filter-class>com.atguigu.filter.AdminFilter</filter-class> </filter> <!--filter-mapping 配置 Filter 过滤器的拦截路径--> <filter-...