我们的产品是在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
。
可能是什么原因?
注意:我没有使用任何过滤器进行会话
答案 0 :(得分:10)
您应该从不将请求或会话特定变量分配为类的字段,在整个应用程序的生命周期中只有一个实例。然后,所有网页访问者将共享相同的变量。访问者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。