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

Spring security 为什么我的(SpringSecurity)servlet过滤器会被调用两次?,spring-security,servlet-filters,Spring Security,Servlet Filters,你知道为什么我的SpringSecurityFilter子类中的doFilterHttp在每次请求时都会被调用两次吗?我真的不知道从哪里开始找。感觉有点难受 我正在逆向工程一个度假同事的代码。尽我所能,以下是相关配置: 在web.xml中: <filter> <filter-name>userSecurityFilter</filter-name> <filter-class>org.springframework.web.filt

你知道为什么我的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>

用户安全过滤器
org.springframework.web.filter.DelegatingFilterProxy
用户安全过滤器
*.做
用户安全过滤器
/json/*

在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/*URL应用了两次过滤器链,而其他URL只应用了一次。我将返回并检查以确保我刚才所说的是真的。

这里没有太多内容,但可能是servlet容器正在处理多个Dispatcher,请在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发布过滤器映射吗?

与经典的Servlet过滤器不同,在web.xml中没有配置Spring安全过滤器。而是在application-context.xml(或您在web.xml中导入的任何.xml配置文件)中的某个位置配置它们

查找具有如下标记的bean:

<custom-filter position="LAST" />

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

好的,我想已经修复了

<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/*

在/json/下有以“.do”结尾的URL,因此这些URL两次应用了所有Spring安全性内容。谢谢你的回复!尽管这是一个愚蠢的问题,我自己也回答了,但通过回答我找到了答案。非常感谢。

更新--并非所有URL都会出现这种情况。在URL上,它会被调用一次。在URL B上,它会被调用两次。gid,感谢您的回复。过滤器映射并不简单。我的过滤器(实际上是我同事的——他在度假,因此我失去了ness:))似乎是通过一些spring魔法添加的,可能是通过userSecurityFilter org.springframework.web.filter.DelegatingFilterProxy启动的。我将进一步了解这一点,并在有更好的问题时回来。