Я создаю веб-приложение 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?
Что более странно, так это то, что первая строка вызывается для создания компонента (между * Создание экземпляра * и * Готовый экземпляр создания), а другая - нет. Но не зная, что такое RequestScopeFilter или RequestScopedBean, я не могу сказать больше. –
Спасибо @SergeBallesta - я обновил вопрос, был в значительной степени моей ошибкой, но привел к другому вопросу сейчас. – rhinds
Если вы добавили его как '@ Bean', то весенняя загрузка обнаружит его и зарегистрирует в качестве обычного фильтра, теперь, если вы также добавите его в цепочку безопасности весны, которую он выполнит дважды. Самое простое - удалить аннотацию '@ Bean'. –