Filter开发步骤
Filter开发分为二个步骤:
- 编写java类实现Filter接口,并实现其doFilter方法。
- 在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
过滤器范例:
1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 12 /** 13 * @ClassName: FilterDemo01 14 * @Description:filter的三种典型应用: 15 * 1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法, 16 * 即是否让目标资源执行 17 * 2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行 18 * 3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能 19 * @author: 孤傲苍狼 20 * @date: 2014-8-31 下午10:09:24 21 */ 22 public class FilterDemo01 implements Filter { 23 24 @Override 25 public void init(FilterConfig filterConfig) throws ServletException { 26 System.out.println("----过滤器初始化----"); 27 } 28 29 @Override 30 public void doFilter(ServletRequest request, ServletResponse response, 31 FilterChain chain) throws IOException, ServletException { 32 33 //对request和response进行一些预处理 34 request.setCharacterEncoding("UTF-8"); 35 response.setCharacterEncoding("UTF-8"); 36 response.setContentType("text/html;charset=UTF-8"); 37 38 System.out.println("FilterDemo01执行前!!!"); 39 chain.doFilter(request, response); //让目标资源执行,放行 40 System.out.println("FilterDemo01执行后!!!"); 41 } 42 43 @Override 44 public void destroy() { 45 System.out.println("----过滤器销毁----"); 46 } 47 }
在web. xml中配置过滤器:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 7 <display-name></display-name> 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file> 10 </welcome-file-list> 11 12 <!--配置过滤器--> 13 <filter> 14 <filter-name>FilterDemo01</filter-name> 15 <filter-class>me.gacl.web.filter.FilterDemo01</filter-class> 16 </filter> 17 18 <!--映射过滤器--> 19 <filter-mapping> 20 <filter-name>FilterDemo01</filter-name> 21 <!--“/*”表示拦截所有的请求 --> 22 <url-pattern>/*</url-pattern> 23 </filter-mapping> 24 25 </web-app>
Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。