Servlet过滤器是在 java Servlet 2.3 中定义的,它能够对Servlet容器中的请求和响应对象,进行检查和修改

Servlet过滤器并不会生成request和response对象,它只起到过滤的作用

Servlet过滤器会在请求还未到Servlet之前检查request对象,修改 Request Header 和 Request 内容;

在Servlet被调用后检查Response对象,修改 Response Header 和 Response 内容

Servlet过滤器可以过滤 Servlet , JSP , HTML 等web组件(JSP最终也是转换为Servlet的)


要想让一个类成为过滤器类,必须实现 java.servlet.Filter接口 实现三个方法:

1.init(FilterConfig filterConfig) - - -初始化

在Servlet容器创建过滤器实例的时候就会调用该方法(也就是服务器刚启动时会创建实例,该方法得到调用) , 这个方法可以读取web.xml文件中Servlet过滤器的初始化参数

2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)

完成实际的过滤操作 这个方法得到调用后,里面重要的一点是要调用chain.doFilter(request,response)方法,来完成对下一个过滤器doFilter(ServletRequest request,ServletResponse response,FilterChain chain))方法的调用,如果没有下一个过滤器,则把客户请求传给相应的web组件

3.destroy()
过滤器销毁阶段 Servlet容器在销毁过滤器实例之前该方法得到调用,以释放占用的资源

1.禁止页面缓存过滤器

public class NoCacheFilter implements Filter {

public void destroy() {
System.out.println("NoCache Filter destroy...");

}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
/*阻止缓存过滤器*/
HttpServletRequest request2 = (HttpServletRequest) request;
HttpServletResponse response2 = (HttpServletResponse) response;

response2.setHeader("Cache-Control", "no-cahce");
response2.setHeader("Pragma", "no-cache");
response2.setDateHeader("Expires", -1);
System.out.println("NoCacheFilter before chain");
chain.doFilter(request2, response2);
System.out.println("NoCacheFilter after chain");

}

public void init(FilterConfig config) throws ServletException {
/*web.xml中Filter的配置参数*/
System.out.println("NoCache Filter init...");
}

}

2.字符编码过滤器

public class EncodingFilter implements Filter {

private String encoding;

public void destroy() {
// TODO Auto-generated method stub

}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
req.setCharacterEncoding(encoding);
System.out.println("EncodingFilter before chain");
chain.doFilter(req, res);
System.out.println("EncodingFilter before chain");
}

public void init(FilterConfig config) throws ServletException {

encoding = config.getServletContext().getInitParameter("encoding");
}

}

web.xml配置文件

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.web.encoding.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>nocacheFilter</filter-name>
<filter-class>com.web.cache.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>nocacheFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

3.chain.doFilter()执行顺序与效果

Filter执行顺序与web.xml中的次序一致。

第一个执行的Filter将会调用chain.doFilter()去执行下一个Filter,若无,则返回自身Filter继续向下执行- - - - - - - - - -响应目标页面

输出结果:

EncodingFilter before chain
NoCacheFilter before chain
NoCacheFilter after chain
EncodingFilter after chain