这是可以重现此问题的代码:
@Controller
public class FirstController {
@RequestMapping(value = "firstpage", method = GET)
public String myHander(HttpSession httpSession) {
if (httpSession.getAttribute("someClass") == null) {
httpSession.setAttribute("someClass", new SomeClass());
}
return "firstpage";
}
}
如果会话中不存在,第一个控制器会将其放入会话中。
@Controller
@SessionAttributes(types = SomeClass.class)
public class SecondController {
@RequestMapping(value = "secondpage", method = GET)
public String myHandler(SomeClass someClass, HttpSession httpSession) {
//asking spring for the SomeClass parameter, that's why we put it in the annotation.
System.out.print(someClass.hashCode());
httpSession.invalidate();
return "secondpage";
}
}
第二个控制器终止会话。
在两个 jsp 文件中,我都有以下代码打印会话对象的哈希码和会话属性的哈希码:
session hash:
<%= session.hashCode() %>
<br/>
someclass hash:
<%= session.getAttribute("someClass").hashCode() %>
现在如果我运行应用程序并访问“首页”,我会得到这个:
会话哈希:1838367636
某类哈希:1075505853
然后我访问“第二页”,会得到这个:
会话哈希:842656294
某类哈希:1075505853
我们可以看到会话本身发生了变化,因为第二个控制器终止了会话。但会话属性(SomeClass 类型)保持不变。
然后,如果我尝试重新访问“第二页”,会话对象每次都会更改,但会话属性保持不变。
为什么会话属性(应该附加到会话)的生命周期比会话本身更长?
您可以使用 mvn jetty:run 运行它来重现问题。