2009-05-04 2 views
1

내 SpringSecurityFilter 하위 클래스에서 doFilterHttp가 각 요청에 대해 두 번 호출되는 이유에 대한 아이디어가 있습니까? 나는 어디에서부터 시작해야할지 정말로 모른다. 조금 덜컹 거리다.(스프링 보안) 서블릿 필터가 두 번 호출되는 이유는 무엇입니까?

나는 휴가중인 동료의 코드를 리버스 엔지니어링합니다. web.xml에

: 스프링 security.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> 

:

<!-- 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은 필터 체인을 두 번 적용하는 반면, 다른 필터 체인은 한 번만 가져옵니다. 나는 돌아가서 방금 말한 것이 정말로 진실인지 확인하려고 할 것입니다.

+0

업데이트 - 모든 URL에서 업데이트되지 않습니다. URL A에서는 한 번 호출됩니다. URL B에서 두 번 호출됩니다. – morgancodes

답변

1

에 대한 web.xml을 보면, 그 서블릿 컨테이너가 여러 디스패처를 처리하고 여기에 갈하지만있을 수 있습니다별로 : 당신이 당신의 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> 

를?

+0

gid, 답장을 보내 주셔서 감사합니다. 필터 매핑은 간단하지 않습니다. 내 필터 (실제로 내 동료의은 - 그는 휴가입니다 따라서 내 손실 다움은 :)) 아마도 \t \t \t userSecurityFilter \t \t를 통해 시작된 일부 봄의 마법을 통해 추가 할 것 org.springframework.web.filter.DelegatingFilterProxy \t morgancodes

+0

더 좋은 질문이있을 때이 부분을 더 살펴보고 다시 돌아올 것입니다. – morgancodes

0

Spring Servlet Filters와 같은 web.xml에는 스프링 보안 필터가 구성되어 있지 않습니다. 대신 application-context.xml (또는 web.xml에서 가져온 .xml 구성 파일)의 어딘가에 구성됩니다. 이 같은 태그 콩에 대한

봐 :

<custom-filter position="LAST" /> 

빈에 해당 태그를 추가하여 봄 보안 필터 체인에 추가합니다. 내 추측으로는 체인에 제대로 추가되었으며 위의 그림과 같이 서블릿 필터로 추가 된 것입니다. 따라서 실제로는 두 번 구성됩니다.

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/그 끝에서 URL이 있습니다, 그래서 그 URL은 봄 보안 물건이 모두 두 번 적용지고 있었다. 답변 주셔서 감사합니다! 비록 그것이 멍청한 문제 였고 나는 스스로에게 대답했습니다. 응답을 통해 일하면서 저에게 답을 얻을 수있었습니다. 매우 감사.

관련 문제