小编典典

在SpringBoot中配置RequestContextListener

spring-boot

我有一个使用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就足够了。


阅读 3859

收藏
2020-05-30

共1个答案

小编典典

如更新/评论中所述,这是我自己的愚蠢造成的。

Spring-Boot能够将Request /
Session范围内的Bean自动连接到超出DispatcherServletSpring文档范围的过滤器中。根据Spring的文档,我们需要添加RequestContextListenerRequestContextFilter来启用此功能:

为了在请求,会话和全局会话级别(网络范围的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然后该功能运行良好。

2020-05-30