在HttpServlet中,HttpSession對(duì)象通常在request.getSession(true)方法調(diào)用時(shí)才創(chuàng)建。HttpSession的使用是有代價(jià)的,需要占用服務(wù)器資源,本著能不浪費(fèi)就不浪費(fèi)的原則,我希望系統(tǒng)中的session都在掌握之中,在需要?jiǎng)?chuàng)建時(shí)由我們的代碼明確創(chuàng)建。但是最近在開(kāi)發(fā)中發(fā)現(xiàn),新的session對(duì)象經(jīng)常在意料之外出現(xiàn),究竟是誰(shuí)在創(chuàng)建session呢?
最常見(jiàn)的地方是錯(cuò)誤的使用request.getSession()函數(shù),通常在action中檢查是否有某個(gè)變量/標(biāo)記存放在session中。這個(gè)場(chǎng)景中可能出現(xiàn)沒(méi)有session存在的情況,正常的判斷應(yīng)該是這樣:
private boolean ifFlagExistInSession(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
if (session.getAttribute("flagName") != null) {
return true;
}
}
return false;
}
而下面的寫法,則可能會(huì)生成一個(gè)新的不在我們意圖之外的session:
private boolean ifFlagExistInSession(HttpServletRequest request) {
HttpSession session = request.getSession(); // a new session created if no session exists
if (session.getAttribute("flagName") != null) {
return true;
}
return false;
}
注意request.getSession() 等同于 request.getSession(true),除非我們確認(rèn)session一定存在或者sesson不存在時(shí)明確有創(chuàng)建session的需要,否則請(qǐng)盡量使用request.getSession(false)。