有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在最初接收线程之外访问HttpSession

我用的是Spring3。当控制器收到请求时,它将控制权传递给服务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. # 1 楼答案

    HttpSession对象本身可以在多个线程中使用(但不是线程安全的,因此必须同步)。然而,Spring正在发挥一些额外的魔力,例如,当你拥有session范围的bean时。也就是说,它使用下面的ThreadLocal将当前会话与线程绑定

    我不知道您的具体场景是什么,但显然Spring试图在您处于另一个线程时从这个ThreadLocal中检索HttpSession,这显然失败了

    解决方案很简单——在@Async方法中提取所需的会话属性,并直接传递它们。顺便说一句,这是更好的设计——避免传递HttpSession对象,因为这会使测试变得更困难,而且代码在未来被重用的可能性也会大大降低