过滤器是个方便开关的程序功能
request 和 response 在被 servlet处理 之前之后 都得被 过滤器链先处理
代码上看则是 servlet的service同步在 doFilter()方法里
Filter基本使用
实现接口 javax.servlet.Filter
Filter 接口和 servlet接口类似
初始化方法同样可以 web.xml中配置初始化参数
过滤方法中得到的参数 request 和 response是接着要给servlet使用的, 可以对其进行修改包装代理. chain是一串过滤器的链, 到链尾之后才是servlet
销毁方法在服务器关闭前调用
public class OneFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(filterConfig);
//服务器启动时调用
System.out.println(this); //输出:com.filter.OneFilter@127da4b
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(chain); //输出:org.apache.catalina.core.ApplicationFilterChain@6e3b4c
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("destroy");
//服务器关闭时调用
}
}
配置web.xml
映射类
<Filter> 中 : filter-name 是唯一标识 <filter-class>为实现类
<filter-mapping> 通过 filter-name映射
映射资源
<servlet-name> : 直接关联servlet唯一标识
<url-pattern> : 关联URL资源路径, 支持通配符, [ * ] 只能一边出现 需通配字符
其中测试说明不同映射方式重合时, 重合servlet会被重复过滤多次
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/servlet/OneServlet</url-pattern>
<servlet-name>OneServlet</servlet-name>
</filter-mapping>
Dispatcher 拦截类型
该项参数很少设置, 默认情况下, 过滤器只通过URL 和 servlet标识拦截, 即缺省值 <dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher> : 对转发拦截
<dispatcher>INCLUDE</dispatcher> : 对包含式转发拦截
<dispatcher>ERROR</dispatcher> : 错误页面 404 等进行拦截
当填写该参数时, 缺省方式要生效的话得一起加上
过滤器链 javax.servlet.FilterChain
多个过滤器时, mapping中排前面的先处理, 返回拦截时后调用