【问题标题】:Why is my (Spring Security) servlet filter getting called twice?为什么我的(Spring Security)servlet 过滤器被调用两次?
【发布时间】:2010-10-23 17:37:56
【问题描述】:

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

【问题讨论】:

  • 更新——并非所有网址都发生这种情况。在 URL A 上,它被调用一次。在 URL B 上,它被调用了两次。

标签: spring-security servlet-filters


【解决方案1】:

好的,我想已经解决了。

<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 内容应用了两次。感谢您的回复!尽管这是一个愚蠢的问题并且我自己回答了,但通过响应让我找到了答案。非常感谢。

【讨论】:

    【解决方案2】:

    这里不多说,但可能是 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 发布过滤器映射吗?

    【讨论】:

    • gid,感谢您的回复。过滤器映射并不简单。我的过滤器(实际上是我同事的——他在度假,因此我迷失了:))似乎是通过一些弹簧魔法添加的,可能是通过 userSecurityFilterorg.springframework.web.filter.DelegatingFilterProxy
    • 我会多看看这个,当我有更好的问题时再回来。
    【解决方案3】:

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

    寻找带有这样标签的bean:

    <custom-filter position="LAST" />
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2015-07-23
      • 2017-08-12
      • 2015-11-11
      相关资源
      最近更新 更多