首页 > 代码库 > 第九章_过滤器

第九章_过滤器

9.1Filter API

过滤器中使用的接口包括FilterFilterConfigFilterChain

过滤器类必须实现javax.servlet.Filter接口。这个接口提供了3个方法:initdoFilterdestroy

当过滤器启动服务时,比如应用程序启动时,Servlet容器就会调用init方法。这个方法只调用一次,并且应该包含过滤器的初始化代码。签名如下:

void init(FilterConfig filterConfig)

每次调用与过滤器相关的资源时,Servlet容器都会调用Filter实例的doFilter方法。该方法会收到一个ServletRequestServletResponseFilteChain

下面是doFilter的签名:

void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)

doFilter方法实现中的最后一行代码应该是调用FilterChain中的doChain方法。

filterChain.doFilter(request, response)

一个资源可以与多个过滤器关联。FilterChain.doFilter()通常会引发调用链中的下一个过滤器被调用。在链中的最后一个过滤器中调用FilterChain.doFilter()会引发资源本身被调用。

如果你没有调用,那么程序的处理将会在这个地方出现停止,并且不会调用请求。

注意:doFilter方法是FilterChain接口中唯一的方法。它与Filter中的doFilter方法稍有不通。在FilterChain中,doFilter只有两个参数,而不是三个。

Filter中的最后一个声明周期方法是destroy,方法签名如下:

void destroy()

这个方法在过滤器即将终止服务之前,由servlet容器调用,一般发生在应用程序停止的时候。

除非一个过滤器类在部署描述符的多个filter元素中进行了声明,否则servlet容器将只给每一类过滤器创建一个实例。由于servlet/JSP应用程序通常是多用户的应用程序,因此可以同时通过多个线程访问一个过滤器实例,但你必须谨慎处理好多线程的问题。

 

9.2、过滤器的配置

FilterConfig访问ServletContext

ServletContext getServletContext()

获取它的名称:

java.lang.String getFilterName()

获取参数:

java.util.Enumeration<java.lang.String> getInitParameterNames()

java.lang.String getInitParameter(java.lang.String parameterName)

 

配置过滤器有两种方法:

1、利用注解@WebFilter

他有以下属性:

asyncSupported:指定过滤器是否支持异步操作模式

description:过滤器的描述

dispatcherTypes:应用过滤器的dispatcher类型

displayName:过滤器的显示名称

filterName:过滤器的名称

initParams:初始参数

largeIcon:过滤器的大图标名称

servletNames:适用于过滤器的Servlets名称

smallIcon:过滤器的小图标名称

urlPatterns:应用过滤器的URL模式

value:应用过滤器的URL模式

@WebFilter(filterName="DataCompressionFilter", urlPatterns={"/*"})
相当于web.xml中的

<filter>
  	<filter-name>DataCompressionFilter</filter-name>
  	<filter-class>
  		the fully-qualified name of the filter class
  	</filter-class>
  </filter>

再举个例子。下面的过滤器中设置了两个初始参数

@WebFilter(filterName="Security Filter", urlPatterns={"/*"}, 
	initParams = {
		@WebInitParam(name="frequency", value=http://www.mamicode.com/"1909"),>相当于

<filter>
  	<filter-name>Security Filter</filter-name>
  	<filter-class>filterclass</filter-class>
  	<init-param>
  		<param-name>frequency</param-name>
  		<param-value>1909</param-value>
  	</init-param>
  	<init-param>
  		<param-name>resolution</param-name>
  		<param-value>1024</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>Security Filter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>


第九章_过滤器