过滤器中使用的接口包括Filter、FilterConfig和FilterChain
过滤器类必须实现javax.servlet.Filter接口。这个接口提供了3个方法:init、doFilter和destroy。
当过滤器启动服务时,比如应用程序启动时,Servlet容器就会调用init方法。这个方法只调用一次,并且应该包含过滤器的初始化代码。签名如下:
void init(FilterConfig filterConfig)
每次调用与过滤器相关的资源时,Servlet容器都会调用Filter实例的doFilter方法。该方法会收到一个ServletRequest、ServletResponse和FilteChain。
下面是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应用程序通常是多用户的应用程序,因此可以同时通过多个线程访问一个过滤器实例,但你必须谨慎处理好多线程的问题。
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="1909"), @WebInitParam(name="resolution", value="1024") } )相当于
<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>
原文地址:http://blog.csdn.net/benjamin_whx/article/details/38756251