我有一个使用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 :
configure()
http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )
但尚未将新的过滤器注册为Bean。根据M. Denium的评论,我不需要所有其他配置来显式添加侦听器/过滤器,只需注册Bean就足够了。
如更新/评论中所述,这是我自己的愚蠢造成的。
Spring-Boot能够将Request / Session范围内的Bean自动连接到超出DispatcherServletSpring文档范围的过滤器中。根据Spring的文档,我们需要添加RequestContextListener或RequestContextFilter来启用此功能:
DispatcherServlet
RequestContextListener
RequestContextFilter
为了在请求,会话和全局会话级别(网络范围的Bean)支持Bean的作用域,在定义Bean之前,需要一些较小的初始配置。(对于标准示波器,单例和原型,不需要此初始设置。)… 实际上,如果您在Spring Web MVC中访问由Spring DispatcherServlet或DispatcherPortlet处理的请求中的作用域Bean,则无需进行特殊设置:DispatcherServlet和DispatcherPortlet已经公开了所有相关状态。
为了在请求,会话和全局会话级别(网络范围的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而引起的:
为了解决这个问题,我只是将创建的方法PreAuthFilter移到了单独的@Bean方法上,@Autowired然后该功能运行良好。
PreAuthFilter
@Bean
@Autowired