过滤器

过滤器

在Web组件响应客户请求的过程中,可能都会完成一些相同的操作,比如都要先检查客户的IP地址是否位于预定于的拒绝IP地址范围内,如果满足这一条件,就直接向客户端返回拒绝响应客户请求的信息,而不会继续执行后续操作。

如果在多个Web组件中编写同样的操作,显然会导致代码重复,将这些重复的代码提取出来作为一个公共的模块,这个模块就是过滤器。过滤器能够对一部分客户请求先进性预处理操作,然后再把请求转发给相应的Web组件,等到Web组件生成了响应结果后,过滤器还能对响应结果进行检查和修改,然后再把修改后的响应结果发送给客户。

20.1 过滤器简介

过滤器能够对Servlet容器传给Web组件的ServletRequest对象和ServletResponse对象进行检查和修改,过滤器本身并不生成ServletRequest对象和ServletResponse对象,它只为Web组件(Servlet、JSP、HTML)提供如下的过滤功能:

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标注来配置过滤器

 

 

示例:

@WebFilter( 
filterName = "NoteFilter",
urlPatterns = "/note",
initParams = {
@WebInitParam(name = "ipblock", value = "221.45"),
@WebInitParam(name = "blacklist", value = "捣蛋鬼")}
)

dispatcherTypes属性指定调用过滤器的模式,DispatcherType是一个枚举类,各个枚举值的意义如下:

DispatcherType.REQUEST: 当客户端直接请求访问待过滤的目标资源时,Web容器会先调用该过滤器

DispatcherType.FORWARD: 当待过滤的目标资源时通过RequestDispatcher的forward(请求转发)方式被访问时,Web容器会先调用该过滤器

DispatcherType.INCLUDE: 当待过滤的目标资源时通过RequestDispatcher的include(请求包含)方式被访问时,Web容器会先调用该过滤器

DispatcherType.ERROR: 当待过滤的目标资源是通过声明式异常处理机制被访问时,Web容器会先调用该过滤器

DispatcherType.ASYNC: 当待过滤的目标资源是被异步访问时,Web容器会先调用该过滤器

 

 

dispathcerTypes属性允许有一个或者多个取值:

示例:

@WebFilter( 
filterName = "SampleFilter",
urlPatterns = {"/*.jsp","/*.do"},
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD}
)

 

20.4 串联过滤器

 

posted @ 2021-06-15 01:07  9761滴  阅读(70)  评论(0编辑  收藏  举报