为什么我的(Spring Security)servlet过滤器被调用两次?

时间:2009-05-04 20:07:10

标签: spring-security servlet-filters

有关为什么我的SpringSecurityFilter子类中的doFilterHttp在每个请求上被调用两次的想法?我真的不知道从哪里开始寻找。感觉有点难过。

我正在逆向设计一个度假的同事的代码。我能想到的最好,这是相关的配置:

web.xml中的

<filter>
    <filter-name>userSecurityFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>userSecurityFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>userSecurityFilter</filter-name>
<url-pattern>/json/*</url-pattern>

在spring-security.xml中:

 <!-- Create the filter chains for developers, users and services -->
 <bean id="userSecurityFilter" class="org.springframework.security.util.FilterChainProxy">
  <security:filter-chain-map path-type="ant">
     <security:filter-chain pattern="/**/json/*"     filters="AuthFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor"/>
     <security:filter-chain pattern="/**/*.do"       filters="AuthFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor"/>
     <security:filter-chain pattern="/**"            filters="anonymousProcessingFilter,logoutFilter,exceptionTranslationFilter,filterInvocationInterceptor"/>
  </security:filter-chain-map>
</bean>

看起来/ ** / json / * urls会将过滤器链应用两次,而其他人只能获得一次。我要回去检查以确保我刚刚说的是真的。

3 个答案:

答案 0 :(得分:2)

好的,我认为修好了。

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

/ json /下的网址以“.do”结尾,所以这些网址会将所有Spring Security内容都应用两次。谢谢你的回复!虽然这是一个愚蠢的问题而且我自己回答了问题,但是通过这些反应让我得到了答案。非常感谢。

答案 1 :(得分:1)

这里不多,但可能是servlet容器正在处理多个调度程序,请在web.xml中查找:

<filter-mapping>
    <filter-name>securityFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <!-- the following is optional, but some containers give the wrong default -->
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

您可以从web.xml发布过滤器映射吗?

答案 2 :(得分:0)

未在web.xml中配置Spring Security过滤器,如经典Servlet过滤器。而是将它们配置在application-context.xml中的某个位置(或者您在web.xml中导入的任何.xml配置文件)。

查找带有这样标记的bean:

<custom-filter position="LAST" />

将该标记添加到bean会将其添加到Spring Security过滤器链中。我的猜测是它正确添加到链中,并且还添加为Servlet过滤器,如上所示。因此它实际配置了两次。