当前位置: 首页 > 知识库问答 >
问题:

在SpringBoot中配置RequestContextListener

嵇永望
2023-03-14

我知道在DispatcherServlet之外使用请求范围bean需要一些配置,并且已经阅读了http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes-oth,但是还没有成功:

对于Servlet3.0+,这可以通过WebApplicationInitializer接口以编程方式完成。

(我正在使用最新的Tomcat,Servlet3+)

我已经尝试使用RequestContextListener和RequestContextFilter(文档说它们和DispatcherServlet执行完全相同的操作),但在这两种情况下,我仍然会出现错误,因为我的autowired对象为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() ) 
    }
http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )

共有1个答案

孔驰
2023-03-14

正如更新/评论中详细描述的那样,这是我自己的愚蠢造成的。

Spring-Boot能够将请求/会话作用域bean自动转换到DispatcherServlet之外的过滤器中。根据Spring的文档,我们需要添加RequestContextListenerRequestContextFilter来启用此功能:

为了在请求、会话和全局会话级别支持bean的范围(Web范围bean),在定义bean之前需要进行一些次要的初始配置。(标准作用域、单例和原型不需要这个初始设置。)...

@Bean public RequestContextListener requestContextListener(){
    return new RequestContextListener();
} 

如果您没有注册该bean,您将得到一个错误,说明您试图访问DispatcherServlet之外的请求范围。

我遇到的问题(autowired对象只是没有被注入)是由于我只是将自定义过滤器注册为标准类实例,而不是Spring托管bean造成的:

http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )

为了解决这个问题,我只需将preauthfilter的创建移到一个sepearte@bean方法中,@autowired功能就可以正常工作了。

 类似资料:
  • 我在学习Spring Boot时遇到了一些编码问题;我想添加一个像Spring3.x那样的CharacterEncodingFilter。就像这样:

  • <dependencyManagement> <dependencies> <dependency> <!--Import dependency management from SpringBoot--> <groupId>org.springframework.boot</groupId>

  • 问题内容: 我正在尝试使用Maven 3 在Spring Boot应用程序中设置活动配置文件。在我的pom.xml中,将默认的活动配置文件和属性spring.profiles.active设置 为development: 但是每次我运行应用程序时,都会在日志中收到以下消息: 并且将SpringBoot配置文件设置为默认值(读取application.properties而不是application

  • null 非常感谢你的帮助

  • 我试图在使用Maven3的Spring Boot应用程序中设置一个活动概要文件。 在我的pom.xml中,我将默认的活动概要文件和属性Spring.profiles.active设置为development: 但是每次运行我的应用程序时,我都会在日志中收到以下消息: 并且SpringBoot配置文件设置为default(读取application.properties,而不是application

  • 我有教育问题: 存在具有windows server 2003(AD)的虚拟机,其中包含用户及其密码。已建立与机器的连接(ip:192.168.56.101:389)。 Web应用程序的目的是使用户能够在AD中更改他的密码。 问题:无法配置到windws server 2003的连接。 我从这个教程开始https://spring.io/guides/gs/authenticating-ldap/