Почему мой фильтр сервлетов (Spring Security) вызывается дважды? - PullRequest
2 голосов
/ 05 мая 2009

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 08 мая 2009

Хорошо, я исправил это, я думаю.

<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-адреса, оканчивающиеся на ".do", поэтому по этим URL-адресам все элементы Spring Security применялись дважды. Спасибо за ответы! Хотя это была глупая проблема, и я сам ответил на нее, проработка ответов привела меня к ответу. Очень ценится.

1 голос
/ 05 мая 2009

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

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

Ищите бобы с таким тегом:

<custom-filter position="LAST" />

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

...