복붙노트

[SPRING] 원래 수신 스레드 외부에서 HttpSession에 액세스

SPRING

원래 수신 스레드 외부에서 HttpSession에 액세스

저는 Spring 3을 사용하고 있습니다. 컨트롤러가 요청을 받으면 Service Bean에서 @Async로 주석 처리 된 메소드 someMethod ()에 컨트롤을 전달한 다음 반환합니다. someMethod () HttpSession 객체에 액세스 할 때이 예외가 발생합니다.

java.lang.IllegalStateException: No thread-bound request found: Are you 
referring to request attributes outside of an actual web request, or 
processing a request outside of the originally receiving thread? If you are 
actually operating within a web request and still receive this message, your 
code is probably running outside of DispatcherServlet/DispatcherPortlet: In 
this case, use RequestContextListener or 
RequestContextFilter to expose the current request.

이 문제를 어떻게 해결할 수 있습니까?

해결법

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

    1.HttpSession 객체 자체는 여러 스레드에서 사용할 수 있지만 (스레드로부터 안전하지 않으므로 동기화해야합니다) 그러나 봄은 약간의 특별한 마술을하고있다. 세션 범위의 bean이있을 때. 즉 ThreadLocal을 사용하여 현재 세션을 스레드와 바인드합니다.

    HttpSession 객체 자체는 여러 스레드에서 사용할 수 있지만 (스레드로부터 안전하지 않으므로 동기화해야합니다) 그러나 봄은 약간의 특별한 마술을하고있다. 세션 범위의 bean이있을 때. 즉 ThreadLocal을 사용하여 현재 세션을 스레드와 바인드합니다.

    나는 정확한 시나리오가 무엇인지 모르지만 분명히 Spring은 다른 스레드에있는 동안이 ThreadLocal에서 HttpSession을 검색하려고 시도한다. 분명히 실패한다.

    솔루션은 간단합니다. @Async 메서드에서 필요한 세션 특성을 추출하고 직접 전달합니다. 이것은 훨씬 더 나은 디자인입니다 - HttpSession 객체를 전달하는 것을 피하십시오. 왜냐하면 테스트가 더 어려워지고 코드가 미래에 재사용 될 가능성이 훨씬 적기 때문입니다.

  2. from https://stackoverflow.com/questions/10473254/accessing-httpsession-outside-of-the-originally-receiving-thread by cc-by-sa and MIT license