2009-05-04 2 views
1

Любые идеи о том, почему doFilterHttp в моем подклассе SpringSecurityFilter вызывается дважды по каждому запросу? Я не знаю, с чего начать смотреть. Чувствую себя немного в тупике.Почему мой фильтр сервлетов Spring Spring вызван дважды?

Я занимаюсь разработкой кода отдыхающего коллеги. Насколько я могу понять, вот соответствующая конфигурация:

в 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> 

В весенне-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> 

Похоже URL-адреса/**/json/* получают цепочку фильтров дважды, в то время как другие получают ее только один раз. Я собираюсь вернуться и проверить, чтобы убедиться, что я только что сказал, это правда.

+0

Обновление - это не происходит на всех URL-адресах. В URL-адресе A он вызывается один раз. В URL B он вызывается дважды. – morgancodes

ответ

1

Не так много, чтобы идти дальше здесь, но это может быть, что контейнер сервлетов обрабатывает несколько диспетчеров, смотрите в 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?

+0

gid, спасибо за ответ. Отображение фильтра не является простым. Мой фильтр (на самом деле мой коллега - он в отпуске, поэтому мое потерянное Бытийность :)), кажется, быть добавлен с помощью каких-то весенних магий, возможно, инициированных с помощью \t \t \t userSecurityFilter \t \t org.springframework.web.filter.DelegatingFilterProxy \t morgancodes

+0

Я посмотрю на это больше и вернусь, когда у меня появятся более интересные вопросы. – morgancodes

0

Фильтры Spring Security не настроены в web.xml, как классические фильтры сервлетов. Вместо этого они настраиваются где-то в файле application-context.xml (или любых файлах конфигурации .xml, которые вы импортируете в свой web.xml).

Посмотрите на фасоль с тэгом как это:

<custom-filter position="LAST" /> 

добавив, что тег в бобе добавит его в цепочке фильтров Spring Security. Я предполагаю, что он добавлен в цепочку правильно и также добавлен в качестве сервлет-фильтра, как показано выше. Следовательно, он фактически настроен дважды.

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> 

Есть URLs под/JSon/этой целью в ".do", так что эти URLs получали все вещи Spring Security применяется дважды. Спасибо за ответы! Хотя это была глупая проблема, и я сам ответил на нее, работая через ответы, отвел меня к ответу. Очень признателен.

Смежные вопросы