Filter
1、功能
- Java Servlet 2.3 中新增加的功能,主要作用是对Servlet 容器的请求和响应进行检查和修改
- Filter 本身并不生成请求和响应对象,它只提供过滤作用
在Servlet 被调用之前,检查Request 对象
»可以对其Request Header 和Request 内容进行审查和修改
在Servlet 调用结束之后,检查Response 对象
»可以对其Response Header 和Response 内容进行审查和修改
- Filter 可以过滤的Web 组件包括Servlet,JSP,HTML等
- Filter主要负责拦截请求,和放行。
- Filter 过滤过程
2、接口Filter
- init( FilterConfig config )
Filter 的初始化方法
容器创建Filter 之后将调用这个方法
使用这个方法可以读取web.xml 文件中定义的初始化参数
- doFilter(ServletRequest req,ServletResponse resp ,FilterChain chain)
该方法完成实际的过滤操作
当客户请求访问与Filter 相关联的URL 时,将调用该方法
chain 用于访问后续的Filter 或Servlet
- destroy()
容器在销毁Filter 实例前调用该方法
该方法中可以释放该Filter 所占用的资源
- Filter的生命周期
Filter的创建和销毁由web服务器控制。
»服务器启动的时候,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。
»拦截到请求时,执行doFilter方法。可以执行多次。
»服务器关闭时,web服务器销毁Filter的实例对象。
3、接口FilterChain
- 过滤器链
- 一组过滤器对某些web资源进行拦截,那么这组过滤器就称为过滤器链。过滤器的执行顺序和<filter-mapping>有关
- 该接口中定义的方法
doFilter(ServletRequest req,ServletResponse resp )
»负责把所有的过滤器给串联起来
»使得一个过滤器执行完后,下一个可以继续执行
»被串联的多个过滤器按照配置文件中的映射顺序依次执行
4、创建Filter
- 实现Filter
package ecut.filter.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
// place your code here
System.out.println( "hello" );
// pass the request along the filter chain
chain.doFilter( req, resp );
System.out.println( "world" );
}
public void destroy() {
}
}
- 注册Filter
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>ecut.filter.filter.HelloFilter</filter-class>
</filter>
- 发布Filter
同Servlet 一样,url-pattern 可以写多个
url-mapping匹配规则有三种:
»精确匹配 —— 如/index.html,只会匹配index.html这个URL
»路径匹配 —— 如/*,会匹配所有的URL
»后缀匹配 —— 如*.html,会匹配所有以.html为后缀的URL
<filter-mapping>
<filter-name>HelloFil