2

关于为什么我的 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/* url 将过滤器链应用了两次,而其他人只应用了一次。我要回去检查以确保我刚才所说的是真的。

4

3 回答 3

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”结尾的 url,因此这些 url 将所有 Spring Security 内容应用了两次。感谢您的回复!尽管这是一个愚蠢的问题并且我自己回答了,但通过响应让我找到了答案。非常感激。

于 2009-05-07T20:02:35.147 回答
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 发布过滤器映射吗?

于 2009-05-04T20:20:02.103 回答
0

没有像经典的 Servlet 过滤器那样在 web.xml 中配置 Spring Security 过滤器。相反,它们被配置在 application-context.xml(或您在 web.xml 中导入的任何 .xml 配置文件)中的某个位置。

寻找带有这样标签的bean:

<custom-filter position="LAST" />

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

于 2009-05-05T22:16:27.200 回答