2

我正在使用HttpSession对象:Spring MVC@Autowired

public abstract class UserController {
    @Autowired
    public HttpSession session;

    @RequestMapping(value = { "" }, method = { RequestMethod.GET })
    public ModelAndView index(){
        User user=(User)session.getAttribute("loginUser");
    }
}

会话线程安全吗?

4

1 回答 1

2

你从 Spring 中得到的只是 HttpSession。没有特殊的线程安全保证。

使用 HttpSession 的实现不一定是线程安全的。另请参阅此问题:Is HttpSession thread safe, are set/get Attribute thread safe operations?

您可以通过以下方式减少竞争条件导致没有同步问题的机会:

  • 减少会话不会同时处理两个请求的机会
  • 不与请求线程以外的另一个线程混淆会话

如果您需要异步处理会话中的数据,我发现在请求线程中从会话中提取不可变对象然后在服务器上的异步进程中使用这些对象是一种更好的策略。这样你就可以尽可能地避免从会话中访问。也就是说,如果您需要完全安全(为什么要冒险),您需要同步。

synchronized(mutexFor(session)) {
  final String data = session.getAttribute("data");
  //do some work
  session.setAttribute("data", newValue);
}
于 2012-12-31T03:27:19.483 回答