在SpringBoot中配置RequestContextListener
我有一个使用Spring-Security的Spring-
Boot应用程序。我有一个请求范围的Bean,我想将其自动连接到安全过滤器链中的自定义过滤器之一,但目前无法正常工作。
我了解需要一些配置才能在DispatcherServlet之外使用请求范围的Bean,并已阅读此http://docs.spring.io/spring/docs/4.0.x/spring-
framework-reference/html/beans.html #beans-factory-scopes-
other 但尚未成功:
对于Servlet 3.0+,可以通过WebApplicationInitializer接口以编程方式完成此操作。
(我使用的是最新的Tomcat,Servlet 3+也是如此)
我尝试过同时使用RequestContextListener和RequestContextFilter(文档说它们和DispatcherServlet都做同样的事情),但是在这两种情况下,我仍然会收到错误消息,因为我的自动装配对象为null:
我尝试注册过滤器
@Configuration@ComponentScan
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
@Override public void onStartup( ServletContext servletContext ) throws ServletException {
super.onStartup( servletContext )
servletContext.addFilter("requestContextFilter", new RequestContextFilter() ).addMappingForUrlPatterns(null, false, "/*")
}
我尝试注册监听器
@Configuration@ComponentScan
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
@Override public void onStartup( ServletContext servletContext ) throws ServletException {
super.onStartup( servletContext )
servletContext.addListener( new RequestContextListener() )
}
我是否缺少明显的东西?我看过Spring Boot的自动配置源代码,还没有发现任何东西。
我是个白痴,我在SpringSecurity配置中的configure()
方法内添加了Filter :
http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )
但尚未将新的过滤器注册为Bean。根据M. Denium的评论,我不需要所有其他配置来显式添加侦听器/过滤器,只需注册Bean就足够了。
回答:
如更新/评论中所述,这是我自己的愚蠢造成的。
Spring-Boot能够将Request /
Session范围内的Bean自动连接到超出DispatcherServlet
Spring文档范围的过滤器中。根据Spring的文档,我们需要添加RequestContextListener
或RequestContextFilter
来启用此功能:
为了在请求,会话和全局会话级别(网络范围的Bean)支持Bean的作用域,在定义Bean之前,需要一些较小的初始配置。(对于标准示波器,单例和原型,不需要此初始设置。)…
实际上,如果您在Spring Web MVC中访问由Spring
DispatcherServlet或DispatcherPortlet处理的请求中的作用域Bean,则无需进行特殊设置:DispatcherServlet和DispatcherPortlet已经公开了所有相关状态。
为了解决这个问题,我需要注册一个RequestContextListener bean:
@Bean public RequestContextListener requestContextListener(){ return new RequestContextListener();
}
如果您不注册该bean,则会收到一条错误消息,指出您试图访问DispatcherServlet之外的Request范围。
我遇到的问题(只是没有插入自动装配的对象)是由于我只是将自定义过滤器注册为标准类实例而不是Spring托管bean而引起的:
http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )
为了解决这个问题,我只是将创建的方法PreAuthFilter
移到了单独的@Bean
方法上,@Autowired
然后该功能运行良好。
以上是 在SpringBoot中配置RequestContextListener 的全部内容, 来源链接: utcz.com/qa/436328.html