使用<servlet-name>时,web.xml中的<filter-mapping>无法正常工作

3

我有一个web.xml文件,其中包含以下内容:

 <filter>
    <description>CASRebroadcastFilter</description>
    <filter-name>CASRebroadcastFilter</filter-name>
    <filter-class>edu.utah.acs.tek.filters.CASSingleSignOutRebroadcast</filter-class>
</filter>

(... more CAS-filters)

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<filter-mapping>
    <filter-name>CASRebroadcastFilter</filter-name>
    <url-pattern>*.do</url-pattern>        
</filter-mapping>

(... more CAS-filter-mappings and the rest of my web.xml...)

环境:Spring 2.5,Glassfish 2.1

这样做的效果符合预期——即CASRebroadcastFilter拦截并处理适当的调用,并允许其他所有内容通过。

但是,如果我将过滤器映射更改为:

<filter-mapping>
    <filter-name>CASRebroadcastFilter</filter-name>
    <servlet-name>dispatcher</servlet-name>
</filter-mapping>

它不起作用。当我说“不起作用”时,我指的是:所有内容都通过了CASRebroadcastFilter,好像它不存在一样,并且没有输出任何错误或其他信息。

就好像标签在我的环境某些方面的上下文中根本不起作用。

有人见过这种情况或知道可能是什么原因吗?

1个回答

1
可能是因为您在使用servlet-name设置过滤器时更改了其顺序。Servlet容器将按照web.xml中配置的顺序运行过滤器,首先是使用url-pattern的过滤器,然后是使用servlet-name的过滤器。因此,使用url-pattern的过滤器始终在使用servlet-name的过滤器之前执行。
因此,通过将其更改为使用servlet-name,您实际上是将其放置在所有使用url-pattern的过滤器之后。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接