복붙노트

[SPRING] 스프링 부트에서 RequestContextListener 구성하기

SPRING

스프링 부트에서 RequestContextListener 구성하기

Spring Security를 ​​사용하는 Spring-Boot 응용 프로그램이 있습니다. 보안 필터 체인에서 내 사용자 지정 필터 중 하나에 자동으로 연결하려는 요청 범위의 Bean이 있지만 현재 작동하지 않습니다.

DispatcherServlet 외부 요청 범위 콩을 사용하려면 일부 구성이 필요하다는 것을 알고 있으며 http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/beans.html을 읽었습니다. # beans-factory-scope-other 그러나 아직 성공하지 못했습니다 :

(최신 Tomcat을 사용하고 있으므로 서블릿 3 이상이됩니다.)

내가 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() ) 
    }

나는 명백한 무엇인가 놓치고 있냐? 나는 스프링 부트 (Spring Boot)를위한 자동 설정 소스 코드를 살펴 보았고, 아직 아무것도 알지 못했다.

최신 정보

나는 바보 였고, SpringSecurity 설정 내 filter를 configure () 메소드 내부에 추가했다.

http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )

Bean으로 새 필터를 등록하지 않았습니다. 아래의 M. Denium의 설명에 따르면, 추가 구성에 명시 적으로 리스너 / 필터를 추가 할 필요는 없으며 단지 bean 등록만으로 충분했습니다.

해결법

  1. ==============================

    1.업데이트 / 설명에서 자세히 설명했듯이, 이것은 내 자신의 어리 석음으로 인한 것입니다.

    업데이트 / 설명에서 자세히 설명했듯이, 이것은 내 자신의 어리 석음으로 인한 것입니다.

    Spring-Boot는 Request / Session 범위 Bean을 DispatcherServlet 외부에있는 필터에 autowire 할 수있다. Spring의 문서에 따라이 기능을 사용하려면 RequestContextListener 또는 RequestContextFilter를 추가해야한다.

    이를 처리하기 위해 RequestContextListener 빈을 등록해야했습니다.

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

    빈을 등록하지 않으면 DispatcherServlet 외부의 Request 범위에 액세스하려고한다는 오류가 발생합니다.

    내가 경험 한 문제 (autowired 객체가 삽입되지 않은 것)는 스프링 관리 빈이 아닌 표준 클래스 인스턴스로 사용자 정의 필터를 등록했다는 사실 때문에 발생했다.

    http.addFilterBefore( new PreAuthFilter(), BasicAuthenticationFilter )
    

    이 문제를 해결하기 위해 필자는 사전 인증 필터를 별도의 @Bean 메서드로 옮겼습니다. @Autowired 기능이 제대로 작동했습니다.

  2. from https://stackoverflow.com/questions/30254079/configuring-requestcontextlistener-in-springboot by cc-by-sa and MIT license