9.2 Filter配置

9.2 Filter配置

当完成Filter的实现后,就可以开始配置FilterFilter的配置需要如下步骤:

  • 确认哪些资源需要使用这个Filter拦截处理。
  • 配置Filter的初始化参数值,这些参数可以在Filterinit方法中读取到;
  • Filter取一个名称。一般来说,这个名称没有什么特别的含义,但在一些特殊的情况下,这个名字十分有用。例如,要记录Filter的初始化时间,但这个应用中有许多的Filter,这时它就可以用来识别Filter了。

FilterConfig接口

getServletContext方法

FilterConfig接口允许通过它的getServletContext的方法来访问ServletContext

1
ServletContext getServletContext()

getFilterName方法

如果配置了Filter的名字,在FilterConfiggetFilterName中就可以获取Filter的名字。getFilterName的定义如下:

1
java.lang.String getFilterName()

获取Filter的初始化参数

当然,最重要的还是要获取到开发者或者运维给Filter配置的初始化参数。为了获取这些初始化参数,需要用到FilterConfig中的两个方法,第一个方法是getParameterNames

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

这个方法返回Filter参数名字的Enumeration对象。如果没有给这个Filter配置任何参数,该方法返回的是空的Enumeration对象。
第二个方法是getParameter:

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

配置Filter的两种方法

有两种方法可以配置Filter:一种是通过WebFilterAnnotation来配置Filter,另一种是通过部署描述来注册。

  • 使用@WebFilter的方法,只需要在Filter的实现类中增加一个注解即可,不需要重复地配置部署描述。当然,此时要修改配置参数,就需要重新构建Filter实现类了。
  • 使用部署描述意味着修改Filter配置只要修改一下文本文件就可以了。

WebFilter的属性

使用@WebFilter,你需要熟悉表9.1中所列出来的参数,这些参数是在WebFilterAnnotation里定义的。所有参数都是可选

属性 描述
asyncSupported Filter是否支持异步操作
description Filter的描述
dispatcerTypes Filter所生效范围
displayName Filter的显示名
filterName Filter的名称
initParams Filter的初始化参数
largeIcon Filter的大图名称
servletName Filter所生效的Servlet名称
smallIcon Filter的小图名称
urlPatterns Filter所生效的URL路径
value Filter所生效的URL路径

举个例子,下述@WebFilter标注配置了一个Filter,该名称为DataCompressionFilter,且适用于所有资源:

1
2
3
4
@WebFilter(
filterName="DataCompressionFilter",
urlPatterns={"/*"}
)

如果使用部署描述中的filterfilter-mapping元素定义,那么它的内容如下:

1
2
3
4
5
6
7
8
9
10
<filter>
<filter-name>DataCompressionFilter</filter-name>
<filter-class>
the fully-qualified name of the filter class
</filter-class>
</filter>
<filter-mapping>
<filter-name>DataCompresionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

再举个例子,下述的Filter配置,描述了两个初始化参数:

1
2
3
4
5
6
7
8
@WebFilter(
filterName = "Security Filter",
urlPatterns = { "/*"},
initParams = {
@WebInitParam(name = "frequency", value = "1909"),
@WebInitParam(name = "resolution", value = "1024")
}
)

如果使用部署描述中的filterfilter-mapping元素,那么该配置应该为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>DataCompresionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

关于部署描述将在第13章“部署”中讨论。