一.Filter简介:
***************************************************************************************
Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件
或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理。使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给Servlet 进行处
理并生成响应,最后Filter 再对服务器响应进行后处理。
二、Servlet过滤器的特点:
***************************************************************************************
1.Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
2.Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器
3.Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
三、Servlet过滤器的适用场合:
***************************************************************************************
1.认证过滤
2.登录和审核过滤
3.图像转换过滤
4.数据压缩过滤
5.加密过滤
6.令牌过滤
7.资源访问触发事件过滤
8.XSL/T过滤
9.Mime-type过滤
四、Servlet过滤器接口的构成:
***************************************************************************************
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
1.init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数
2.doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
3.destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源
五、Servlet过滤器的创建步骤:
***************************************************************************************
1.实现javax.servlet.Filter接口
2.实现init方法,读取过滤器的初始化函数
3.实现doFilter方法,完成对请求或过滤的响应
4.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
5.销毁过滤器
六、Servlet过滤器的发布:
***************************************************************************************
1.发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。
2.<filter>元素用来定义一个过滤器:
属性 含义
filter-name 指定过滤器的名字
filter-class 指定过滤器的类名
init-param 为过滤器实例提供初始化参数,可以有多个
3.<filter-mapping>元素用于将过滤器和URL关联:
属性 含义
filter-name 指定过滤器的名字
url-pattern 指定和过滤器关联的URL,为”/*”表示所有URL
public class LoginFilter implements Filter { private String urlPath;// 用来存放不需要判断的页面路径 public LoginFilter() { } public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String[] urls = urlPath.split(","); for (String s : urls) { String reqPath = request.getRequestURI(); if (reqPath.indexOf(s) != -1) { chain.doFilter(request, response); return; } } Object obj = request.getSession().getAttribute("currentUser"); if (obj == null) { response.sendRedirect("login.jsp"); } else { chain.doFilter(request, response); } } public void init(FilterConfig fConfig) throws ServletException { urlPath = fConfig.getInitParameter("initPath"); } }
原文:http://www.cnblogs.com/bekeyuan123/p/7082716.html