过滤器可以在请求到达servlet之前和servlet响应客户端之前进⾏拦截,相当于⼀个拦截器。主要⽤于进⾏⼀些请求和响应的预处理操作。常⽤的场景有权限的控制、统⼀字符编码等等。
4.12.1 编写过滤器
要实现⼀个过滤器,必须实现⼀个FIlter接⼝,只有实现了这个接⼝的类才称之为过滤器。
示例代码:
public class DemoFilter implements Filter {
...
}
web.xml配置过滤器:
<
filter>
<filter-name>demoFilter</filter-name>
<filterclass>edu.nf.ch09.filter.DemoFilter</filter
-class>
<!-- 初始化参数 -->
<init-param>
<param-name>param</param-name>
<param-value>hello</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<!-- 什么请求可以经过此过滤器, /*表示所有
请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
4.12.2 过滤器的⽣命周期
与Servlet类似, Filter同样也是容器负责创建和销毁,与Servlet的区别在于,容器会在启动的时候最先创建所有的过滤器,并执⾏init⽅法进⾏初始化。
⽣命周期⽅法:
⽅法 | 说明 |
init | 初始化⽅法,容器启动时执⾏⼀次 |
doFilter | 请求过滤⽅法,决定请求是否放⾏ |
destroy | 容器销毁过滤器之前执⾏的⽅法 |
代码实例:
public class DemoFilter implements Filter{
@Override
public void destroy() {
System.out.println("准备销毁
DemoFilter");
}
@Override
public void doFilter(ServletRequest
request, ServletResponse response,
FilterChain chain)
throws IOException,
ServletException {
//FilterChain表示⼀个过滤链对象,因为
过滤器可能会存在多个
//同时这个对象将决定是否放⾏当前请求,
//放⾏的话则请求会继续到达下⼀个过滤器
或者servlet中
System.out.println("请求经过
DemoFileer..放⾏");
chain.doFilter(request, response);
System.out.println("响应前经过
DemoFilter...");
}
@Override
public void init(FilterConfig config)
throws ServletException {
String name =
config.getInitParameter("param");
System.out.println("初始化
DemoFilter,获取初始化参数: "+name);
}
}
4.12.3 过滤链
配置示例:
<!-- 配置第⼀个过滤器 -->
<filter>
<filterclass>edu.nf.ch09.filter.FirstFilter</filte
r-class>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置第⼆个过滤器-->
<filter>
<filter-name>secondFilter</filter-name>
<filterclass>edu.nf.ch09.filter.SecondFilter</filt
er-class>
</filter>
<filter-mapping>
<filter-name>secondFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>