這裏不再是可以重現此問題的代碼:春季生命週期的問題:註釋@SessionAttributes使會話屬性過得比會議本身
@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
SomeClass的哈希:1075505853
,然後我參觀 「secondpage」,並會得到這樣的:
會議散列:842656294
SomeClass的哈希:1075505853
,我們可以看到,會議本身發生變化,因爲第二個控制器殺死了會話。但會話屬性(類型SomeClass)保持不變。
然後,如果我嘗試重新訪問「第二頁」,會話對象每次都會更改,但會話屬性保持不變。
爲什麼會話屬性(應該附加到會話中)具有比會話本身更長的生命週期?
PS:完整的代碼是在這裏:https://github.com/cuipengfei/One-hundred-thousand-why/tree/master/20130701SessionAttributesLifeCycle/SpringMVC
你可以用MVN碼頭運行:運行重現該問題。