过滤器可以对资源的请求和相应提供过滤功能,配置在web.xml文件中。
过滤器可用来实现以下功能
1. 权限过滤
2. 登陆和检查验证
3. 图像转换
4. 数据压缩
5. 加密
6. 令牌验证
7. 触发访问资源的事件
8. XSL/T过滤
9. Mime-type chain过滤
在filter服务被加载到web容器中时首先调用init函数,且仅调用一次,如果init函数调用失败,filter将不能工作。参数FilterConfig对象包含过滤器在web.xml中的配置参数。
过滤功能在doFilter函数中实现,包含ServletContext参数。doFilter函数在每次请求或响应经过过滤器链的时候被调用,FilterChain.doFilter用于调用下一个过滤器的doFilter方法。
该函数可实现:
1. 检查request
2. 替换请求内容或请求头信息
3. 替换响应内容或响应头信息
destroy方法由web容器调用,指示它正在退出服务的过滤器。此方法仅调用一次,即当过滤器的doFilter方法中的所有线程都退出后或超时时间已过。
Web容器调用此方法后,这个过滤器的doFilter方法将不会再被调用。
该方法让过滤器可以清理其占有的资源,如内存,文件和线程,并确保任何持久性状态与内存中的过滤器的当前状态同步。
Example:
web.xml
1 <filter> 2 <filter-name>filter1</filter-name> 3 <filter-class>com.filter.MyFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>filter1</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping> 9 10 <filter> 11 <filter-name>filter2</filter-name> 12 <filter-class>com.filter.MyFilter</filter-class> 13 </filter> 14 <filter-mapping> 15 <filter-name>filter2</filter-name> 16 <url-pattern>/*</url-pattern> 17 </filter-mapping>
在web.xml文件中配置两个过滤器filter1和filter2,拦截所有请求
MyFilter.java
1 public class FilterOne implements Filter { 2 3 //Filter 链的执行 4 public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) 5 throws IOException, ServletException { 6 // 对请求进行过滤 7 System.out.println("filter one before"); 8 9 // 下一个过滤器或 10 arg2.doFilter(arg0, arg1); 11 12 // 对响应的过滤 13 System.out.println("filter one after"); 14 } 15 16 // 初始化过滤器 17 public void init(FilterConfig arg0) throws ServletException { 18 System.out.println("filter one init"); 19 } 20 21 // 释放过滤器使用的资源 22 public void destroy() { 23 System.out.println("filter one destroy"); 24 } 25 26 }
输出:
filter one before
filter two before
filter two after
filter one after