【问题标题】:request.getSession is not returning same sessionrequest.getSession 没有返回相同的会话
【发布时间】:2011-08-29 19:36:16
【问题描述】:

我们的产品是在 Spring 3.0 MVC 中开发的。

我们在控制器中使用了如下会话。

  @Controller
  public class LoginController{
     HttpSession session;

     @RequestMapping(value="/index.htm",method = RequestMethod.POST)
     public ModelAndView viewIndex(HttpServletRequest request){
     session=request.getSession(false);
     System.out.println(request.getSession(false));
     System.out.println(session);   
     }
  }

在 Firefox 中,我可以看到 request.getSession(false)session 都以相同的值打印。

在 IE 中,我可以看到 request.getSession(false) 打印一个值,而 session 打印为 null

可能是什么原因?

注意:我没有对会话使用任何过滤器

【问题讨论】:

  • 将会话分配给控制器的字段是一个非常糟糕的主意,您只是在询问奇怪的并发问题。摆脱它,并确保仅使用局部变量时问题仍然存在。

标签: java session servlets spring-mvc


【解决方案1】:

您应该绝不将特定于请求或会话的变量分配为在整个应用程序生命周期中只有一个实例的类的字段。然后,所有网页访问者将共享相同的变量。然后访客 X 将与访客 Y 共享会话。这是一个巨大的数据完整性泄漏。

关于获取会话,如果您需要会话,只需直接使用 request.getSession() 而不使用布尔值。 不要将其分配给某个字段以供“以后重用”。

@RequestMapping(value="/index.htm",method = RequestMethod.POST)
public ModelAndView viewIndex(HttpServletRequest request){
    HttpSession session = request.getSession();
    // ... Get/set attributes?
}

有关 servlet 如何在幕后工作的更多背景信息(Spring MVC 是一个构建在基本 Servlet API 之上的框架),您可能会发现这篇文章很有用:How do servlets work? Instantiation, sessions, shared variables and multithreading

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2014-03-25
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多