过滤器
- 他会在一组资源的前面执行
- 有拦截请求的能力
如何书写过滤器
- 写一个类实现filter接口
- 在web.xml中进行配置
- 注意:Filter-mapping中可以使用Servlet-name执行要过滤的资源
Filter接口
- init(FilterConfig)创建Filter之后,立即执行,FIlter会在服务器启动的时候就进行创建
- FilterConfig 对应web.xml中配置文件,可以获取Filter的名字,初始化参数,和ServletContext
- destroy()销毁之前执行,在服务器关闭时销毁
- doFilter(ServletRequest,ServletResponse,FilterChain)每次过滤时都会执行
- ==FilterChain的一个doFilter方法可以放行==
- 如果有下一个目标过滤器,那么就执行目标过滤器,如果没有下一个目标过滤器,就执行下一个目标资源
- ==FilterChain的一个doFilter方法可以放行==
多个过滤器的执行顺序
- web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源
- 现在过滤器中配置的先执行,如果放行了,还有过滤器就执行过滤器,如果没有就执行资源
过滤器的四种拦截方式
- 拦请求(REQUEST)
- 直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
- 拦转发(FORWARD)
- 转发访问执行过滤器。包括RequestDispatcher#forward()方法,标签都是转发访问
- 拦包含(INCLUDE)
- 包含访问执行过滤器。包括RequestDispatcher#include()方法,标签都是包含访问;
- 拦错误(ERROR)
- 当目标资源在web.xml中配置为中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
- ==还需要进行配置才可以生效,拦截方式的配置,在Filter的配置文件内==
- 拦截方式的配置问题:可以在中添加0~n个子元素,来说明当前访问的拦截方式。
- 格式:
- 默认的拦截方式是:REQUEST
- REQUEST和FORWARD用的多一点