过滤器:Filter和Servlet是一样的都是单例的!
他会在一组资源(如jsp、servlet、.css、.html等)的前面执行。可以让请求得到目标资源,也可以不让请求达到。
过滤器有拦截请求的能力。
Filter接口:
void init(FilterConfig) 创建之后马上执行,Filter会在服务器启动时就创建
void destory() 销毁之前执行,会在服务器关闭时销毁
void doFilter(ServletRequest,ServletResponse,FilterChain) 每次过滤时都会执行
在web.xml中配置:可以通过“*”来执行目标资源:
(和Servlet的配置很像)
<filter>
<filter-name>AFilter.java</filter-name>
<filter-class>rhh.TestFilter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter.java</filter-name>
<url-pattern>/*</url-pattern> <--表示过滤所有资源-->
</filter-mapping>
FilterConfig(和ServletConfig相似):
FilterConfg | ServletConfig |
getFilterName() | getServletName() |
getInitParameter(String name) | getInitParameter(String name) |
getInitParameterNames() | getInitParameterNames() |
getServletContext():获取application | getServletContext():获取application |
FilterChain:
doFilter(ServletResquest, ServletResponse):放行,相当于调用了目标Servlet的 service()方法!
执行目标资源,或是执行下一个过滤器,若没有下一个过滤器那么执行的是目标资源,若有,则执行的是下一个过滤器
过滤器的四种拦截方法:在web.xml文件中的<filter-mapping></filter-mapping>中配置
1.拦请求 REQUEST
<dispatcher>REQUEST</dispatcher>
2.拦转发 FORWARD
<dispatcher>FORWARD</dispatcher>
3.拦包含 INCLUDE
<dispatcher>INCLUDE</dispatcher>
4.拦错误 ERROR
<dispatcher>ERROR</dispatcher>
若这四个都没有配置,则默认拦截的是request
Filter的执行顺序是按在xml文件中<mapping>里的位置的顺序执行的,靠前的先执行。
过滤器的应用场景:
执行目标资源之前做预处理工作,例如设置编码(几乎所有的Servlet都需要写request.getCharacterEncodin(),可以把它们放入一个Filter中),这种尝试一般都会被放行。
通过条件判断是否放行,例如校验当前用户是否已经登录或当前用户ID是否禁用。
在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理。(回程拦截)
还可以为<filter-mappng>指定目标资源为某个Servlet,例如:
<filter-mapping>
<filter-name>filterName</filter-name>
<servlet-name>ServletNames</servlet-name> <--指定一个或多个Servlet拦截-->
</filter-mapping>
这里没有绑定<url-pattern>而是<servlet-name>!