Java中Servlet Filter配置(web.xml详解)

Java中Servlet Filter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。

Filter配置过滤器元素

filter元素

filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素:

1. icon  可选元素,它声明IDE能够使用的一个图象文件。

2. filter-name  必需元素,它给过滤器分配一个选定的名字。

3. display-name  可选元素,它给出IDE使用的短名称。

4. description  可选元素,它给出IDE的信息,提供文本文档。

5. filter-class  必需元素,它指定过滤器实现类的完全限定名。

6. init-param  可选元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。

<web-app> 
  <filter> 
    <filter-name>MyFilter</filter-name>  
    <filter-class>myPackage.FilterClass</filter-class> 
  </filter>  
  <filter-mapping>...</filter-mapping> 
</web-app>

filter-mapping元素

filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素:

1. filter-name  这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。

2. url-pattern  此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供 url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤 器适用于多个模式,可重复整个filter-mapping元素。

3. servlet-name  此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个 filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter- mapping元素。

<web-app> 
  <filter> 
    <filter-name>MyFilter</filter-name>  
    <filter-class>myPackage.FilterClass</filter-class> 
  </filter>  
  <filter-mapping> 
    <filter-name>MyFilter</filter-name>  
    <url-pattern>/someDirectory/SomePage.jsp</url-pattern> 
  </filter-mapping> 
</web-app>

Filter配置

注册Filter

<web-app>
  <filter> 
    <filter-name>testFitler</filter-name>  
    <filter-class>org.test.TestFiter</filter-class>  
    <init-param> 
      <param-name>word_file</param-name>  
      <param-value>/WEB-INF/word.txt</param-value> 
    </init-param> 
  </filter>
</web-app>

<filter-name> 用于为过滤器指定一个名字,该元素的内容不能为空。

<filter-class> 用于指定过滤器的完整的限定类名。

<init-param> 用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

映射Filter

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

(1)<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

(2)<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

(3)<servlet-name>指定过滤器所拦截的Servlet名称。

(4)<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

(5)<filter-mapping> 过滤器拦截配置

如果连接目标资源是一个Servlet,可以选择url和servlet名称两种配置方式:

<!-- 拦截/hello是Servlet 路径 -->
<url-pattern>/hello</url-pattern>
<!-- 拦截Servlet 还可以通过Servlet 名称进行拦截 -->
<servlet-name>HelloServlet</servlet-name>

(6)url-pattern 和 Servlet中路径写法一样,有三种 : 完全匹配、目录匹配、扩展名匹配

(7)<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式

<dispatcher> 子元素可以设置的值及其意义:

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

例子

映射过滤应用程序中所有资源

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

过滤指定的类型文件资源

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>

其中<url-pattern>*.html</url-pattern>要过滤jsp那么就改*.html为*.jsp,但是注意没有“/”斜杠

同时过滤多种类型资源

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

过滤指定的目录

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>/folder_name/*</url-pattern>
</filter-mapping>

过滤指定的servlet

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <servlet-name>loggerservlet</servlet-name>
</filter-mapping>
<servlet>
    <servlet-name>loggerservlet</servlet-name>
    <servlet-class>myfilter.LoggerServlet</servlet-class>
</servlet>

过滤指定文件

<filter>
    <filter-name>loggerfilter</filter-name>
    <filter-class>myfilter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerfilter</filter-name>
    <url-pattern>/simplefilter.html</url-pattern>
</filter-mapping>

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。