2015-05-18 4 views
0

Я создаю веб-приложение Spring Boot, и у меня есть объект с привязкой к запросу.Объем запроса, который инициализируется несколько раз

Я использую пружинную безопасность, и необходим получить доступ к запросу область действия боба в цепи фильтра (предварительно DispatcherServlet), так что я зарегистрировал RequestContextListener, чтобы сделать его доступным - что все работает отлично: я могу autowire запрос области действия боба в мою цепочку фильтров и использовать ее в порядке. Тем не менее, похоже, что обработанный объектом запрос повторно инициализируется после пружинной цепи фильтра безопасности.

Бревна ниже:

May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.util.matcher.AntPathRequestMatcher] Checking match of request : '/app/test'; against '/logout' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 5 of 12 in additional filter chain; firing Filter: 'SystemSecurityFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.util.matcher.AntPathRequestMatcher] Checking match of request : '/app/test'; against '/________site-memory-status' 
May 18 06:19:40 DEBUG [org.springframework.security.web.util.matcher.AntPathRequestMatcher] Checking match of request : '/app/test'; against '/________site-monitor' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 6 of 12 in additional filter chain; firing Filter: 'RequestScopeFilter' 
May 18 06:19:40 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'scopedTarget.requestScopedBean' 
May 18 06:19:40 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'application' 
May 18 06:19:40 INFO [com.test.app] Creating RequestScopedBean. 
May 18 06:19:40 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Finished creating instance of bean 'scopedTarget.requestScopedBean' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 7 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 8 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy] Delegating to org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter' 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor' 
May 18 06:19:40 DEBUG [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /app/test; Attributes: [permitAll] 
May 18 06:19:40 DEBUG [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter, returned: 1 
May 18 06:19:40 DEBUG [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Authorization successful 
May 18 06:19:40 DEBUG [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] RunAsManager did not change Authentication object 
May 18 06:19:40 DEBUG [org.springframework.security.web.FilterChainProxy] /app/test reached end of additional filter chain; proceeding with original chain 
May 18 06:19:40 INFO [com.test.app] Creating RequestScopedBean. 
May 18 06:19:40 DEBUG [org.springframework.web.servlet.DispatcherServlet] DispatcherServlet with name 'dispatcherServlet' processing GET request for [/app/test] 
May 18 06:19:40 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'AppController' 

Вы увидите строку «Создание RequestScopedBean» - это регистрируется в конструкторе моей просьбе областью действия фасоли, и называется дважды - один раз в точке, что мой пользовательский фильтр вызывается (RequestScopeFilter), а затем снова после цепи фильтра перед передачей в поле DispatchServlet. Это ожидаемое поведение? Кажется странным, что он был доступен раньше, но затем все еще переинициализируется на DispatcherServlet - предположил, что он просто настраивается, но не может видеть никаких параметров в RequestContextListener. Думал, что я должен поменять местами RequestContextFilter и использовать метод setThreadContextInheritable, чтобы узнать, достигает ли он того, что я хочу, но не смог найти окончательного совета о том, когда использовать один над другим.


UPDATE

Хорошо, это второй раз в неделе я был идиотом на SO - это не было на самом деле Spring инициализации боба дважды, это был мой фильтр выполняется дважды и изменения, которые я делал для запроса, были связаны с тем же сообщением.

Следующий вопрос: почему фильтр выполняется дважды? Мое единственное предположение заключается в том, что я зарегистрировал фильтр как Spring @Bean и добавил его явно в цепочку фильтров Spring. Должен ли я просто изменить, чтобы реализовать OncePerRequestFilter, или есть какой-то другой вариант, чтобы остановить его выполнение в стороне от моей цепочки фильтров Spring Security?

+0

Что более странно, так это то, что первая строка вызывается для создания компонента (между * Создание экземпляра * и * Готовый экземпляр создания), а другая - нет. Но не зная, что такое RequestScopeFilter или RequestScopedBean, я не могу сказать больше. –

+0

Спасибо @SergeBallesta - я обновил вопрос, был в значительной степени моей ошибкой, но привел к другому вопросу сейчас. – rhinds

+0

Если вы добавили его как '@ Bean', то весенняя загрузка обнаружит его и зарегистрирует в качестве обычного фильтра, теперь, если вы также добавите его в цепочку безопасности весны, которую он выполнит дважды. Самое простое - удалить аннотацию '@ Bean'. –

ответ

1

Проблема была вызвана тем, что я инициализировал компонент, обработанный запросом, явно в фильтре (я устанавливал определенное состояние для запроса в компоненте), и это глупо регистрировало одно и то же сообщение.

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

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