过滤器
Posted 9761滴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤器相关的知识,希望对你有一定的参考价值。
在Web组件响应客户请求的过程中,可能都会完成一些相同的操作,比如都要先检查客户的IP地址是否位于预定于的拒绝IP地址范围内,如果满足这一条件,就直接向客户端返回拒绝响应客户请求的信息,而不会继续执行后续操作。
如果在多个Web组件中编写同样的操作,显然会导致代码重复,将这些重复的代码提取出来作为一个公共的模块,这个模块就是过滤器。过滤器能够对一部分客户请求先进性预处理操作,然后再把请求转发给相应的Web组件,等到Web组件生成了响应结果后,过滤器还能对响应结果进行检查和修改,然后再把修改后的响应结果发送给客户。
20.1 过滤器简介
1.过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头和请求正文中的内容,或者对请求进行预处理操作
2.过滤器能够在Web组件被调用之后检查ServletResponse对象,修改响应头和响应正文。
过滤器负责过滤的Web组件可以是Servlet、JSP、HTML文件
过滤器可以检查ServletRequest和ServletResponse对象,并且利用ServletRequestWrapper和ServletResponseWrapper包装类来修改ServletRequest和ServletResponse对象;可以在web.xml文件中为过滤器映射特定的URL,当客户请求访问此URL时,Servlet容器就会先出发过滤器的工作;多个过滤器还可以被串联在一起工作
20.2 创建过滤器
所有自定义的过滤器类都必须实现javax.servlet.Filter接口,这个接口含有以下必须实现的方法:
//过滤器的初始化方法,在Web应用启动时,Servlet容器先创建包含了过滤器配置信息的FilterConfig对象,然后创建Filter对象,接着调用Filter对象的init方法,这个方法中可以通过config参数来读取web.xml文件中为过滤器配置的初始化参数,即FilterConfig的getInitParameter(String parameterName)方法,这个方法能获取web.xml文件中为为过滤器配置的初始化参数
init(FilterConfig config);
//这个方法中的内容就是过滤操作的内容,当客户端请求的url与在web.xml中为过滤器配置的url-pattern对应的时候,Servlet容器就会调用这个doFilter方法,FilterChain参数用于访问后续过滤器或者Web组件
doFilter(ServletRequesst req, ServletResponse res, FilterChain chain);
//Servlet容器在销毁过滤器对象前调用改方法,该方法中可以释放过滤器占用的资源
destory();
过滤器的生命周期:
初始化阶段:当Web应用启动时,Servlet容器会加载过滤器类,创建过过滤器配置对象(FilterConfig)和过滤器对象,并调用过滤器对象的init方法
运行时阶段:客户请求URL与过滤器映射的URL匹配时,Servlet容器调用过滤器的doFilter方法
销毁阶段:当Web应用终止时,Servlet容器先调用过滤器对象的destory方法,然后销毁过滤器对象
20.3 发布过滤器
发布过滤器的两种方法:
1.在web.xml文件中配置过滤器
<filter>
<!--过滤器名-->
<filter-name>NoteFilter</filter-name>
<!--过滤器完整类名-->
<filter-class>mypack.NoteFilter</filter-class>
<!--过滤器初始化参数,可以通过 FilterConfig类的实例的getInitParameter(String name)方法获得-->
<init-param>
<param-name>ipblock</param-name>
<param-value>221.45</param-value>
</init-param>
<init-param>
<param-name>blacklist</param-name>
<param-value>捣蛋鬼</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<!--当客户请求的URL和该过滤器的url-pattern匹配时,Servlet容器调用该过滤器的doFilter()方法-->
<url-pattern>/note</url-pattern>
</filter-mapping>
注意 在web.xml文件中,必须先配置所有的过滤器,在配置Servlet
如果希望过滤器对任何URL请求都能过滤,可以把url-pattern的值设置为“/*”
2.在过滤器类中用@WebFilter标注来配置过滤器
示例:
dispatcherTypes属性指定调用过滤器的模式,DispatcherType是一个枚举类,各个枚举值的意义如下:
DispatcherType.REQUEST: 当客户端直接请求访问待过滤的目标资源时,Web容器会先调用该过滤器
DispatcherType.FORWARD: 当待过滤的目标资源时通过RequestDispatcher的forward(请求转发)方式被访问时,Web容器会先调用该过滤器
DispatcherType.INCLUDE: 当待过滤的目标资源时通过RequestDispatcher的include(请求包含)方式被访问时,Web容器会先调用该过滤器
DispatcherType.ERROR: 当待过滤的目标资源是通过声明式异常处理机制被访问时,Web容器会先调用该过滤器
DispatcherType.ASYNC: 当待过滤的目标资源是被异步访问时,Web容器会先调用该过滤器
dispathcerTypes属性允许有一个或者多个取值:
示例:
20.4 串联过滤器
以上是关于过滤器的主要内容,如果未能解决你的问题,请参考以下文章