过滤器,其实就是对客户端发出来的请求进行过滤。浏览器发出,然后服务器派Servlet处理。在中间就可以过滤,其实过滤器起到的是拦截的作用,也就是拦截器。
-
作用
1.对一些敏感词汇进行过滤
2.统一设置编码
3.自动登录
如何使用Filter
1.定义一个类,实现Filter接口
public class FilterDemo implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("来到过滤器");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
2.注册过滤器
在web.xml里面注册,注册的方式与Servlet差不多
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter的生命周期
- 创建
在服务器启动的时候创建
- 销毁
服务器停止的时候销毁
Filter的执行顺序
1.客户端发出请求,先经过过滤器,如果过滤器通过,才会到Servlet。
2.如果有多个过滤器,那么将会按照注册的映射顺序(Filter-mapping 的顺序)进行依次拦截,只要有一个过滤器未通过,那么后面的过滤器,以及访问的Servlet都不会收到请求
3.需要执行chain.doFilter()方法,才算成功通过
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("来到过滤器");
chain.doFilter(ServletRequest, ServletResponse);//标志成功通过这个过滤器,放行,让请求到达下一个目标
}
细节:
1.Filter接口的 init方法的参数 FilterConfig,可以用于获取Filter在注册的名字,以及初始化参数。这里的功能与ServletConfig是一样的。
2.如果想要放行,让请求到达下一个目标,需要使用参数chain,操作foFiler方法
chain.doFilter(ServletRequest, ServletResponse);//通过这个过滤器,放行,让请求到达下一个目标
3.< url-pattern>/*< /url-pattern>,表明Filter所要过滤的指定对象,类型,或者目录,其写法格式与servlet一样,( * 号是通配符)
1.全路径匹配,以 / 开始(以对象过滤)(精确匹配)
/loginServlet
2.以目录匹配,以 / 开始,以 * 结束(以目录过滤)
/demo01/*
3.以后缀名匹配,以 * 开始,以后缀名结束(以类型过滤)
*.jsp , *.html , *.do
4.针对 dispatcher 设置
REQUEST:只要是请求过来,都拦截(默认为REQUEST)
FORWARD:只要是转发,都拦截
ERROR:页面出错发生跳转时,拦截
INCLUDE:包含页面的时候就拦截
PS:
可以书写多个 url-pattern 或者 dispatcher 标签,以组合过滤不同的类型
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/*.html</url-pattern>
<url-pattern>/ServletDemo</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>