Filter的作用是在请求到达web资源(HTML、css、Servlet、Jsp)之前拦截,做一个预处理。
创建一个类实现Filter接口,在web.xml中对文件进行配置
1 <filter> 2 <filter-name>Filter的别名</filter-name> 3 <filter-class>Filter的全类名</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>别名</filter-name> 7 <url-pattern>需要Filter拦截的资源地址</url-pattern> 8 </filter-mapping>
Filter的生命周期:
构造器在服务器启动时调用,只调用一次,Filter是单例多线程的。
init():构造器被调用后调用
doFilter():每一次拦截请求时都会调用。参数有:ServletRequest request 请求报文,ServletResponse response响应报文,FilterChain chain用于放行请求。
chain.doFilter(request,response)放行请求。
destroy方法在项目停止时调用。
url-pattern设置:
精确匹配:目标资源地址和url-pattern地址一模一样时拦截。如/1.jsp
路径匹配:访问在url-pattern配置路径下的目标资源时拦截,如/jsp/*
后缀匹配:访问资源和url-pattern后缀一样就会拦截。如*.jsp
拦截Servlet:Filter的url-pattern与Servlet的一致或者在filter-mapping标签下添加一个servlet-name标签。
多个Filter的执行顺序由filter-mapping的配置顺序决定。
dispatcher
Filter默认只会拦截直接向目标资源发送的请求,而像转发之类的请求不会拦截
可以在在filter-mapping的dispatcher标签中来指定过滤器要拦截的请求类型:
<dispatcher>REQUEST</dispatcher>
代表拦截发送到目标资源的直接请求,如果不指定dispatcher默认值就是request
如果在filter-mapping设置了dispatcher则按照设置的内容来
<dispatcher>FORWARD</dispatcher>
FORWARD代表会拦截通过转发访问目标资源的请求。
<dispatcher>INCLUDE</dispatcher>
INCLUDE会拦截动态包含的请求。
<dispatcher>ERROR</dispatcher>
ERROR是拦截在web.xml中声明的错误页面的
我们可以在web.xml文件进行一个错误页面的映射,通过如下标签:
<error-page>
<error-code>404</error-code>
<location>/4.jsp</location>
</error-page>
error-code指的是发生错误的代码
location 发生错误以后去到的页面