Session的生命周期
1.1 session什么時候創建:
Session一般存儲在服務器的內存中,Sessinon在用戶訪問第一次訪問服務器時創建(注意只有訪問JSP、Servlet等程序時才會創建Session,只訪問HTML、IMAGE等靜態資源並不會創建Session)。當然,強制生成Session可使用request.getSession(true)方法。
1.2 session什么時候銷毀:
1.session的持有者(即客戶端瀏覽器)在最大無活動等待時間(MaxInactiveInterval)內無任何響應或請求 ;
設置方法有許多(這里隨便寫兩種):
1.session.setMaxInactiveInterval(2 * 3600); // Session保存兩小時
2.web.xml里有:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
2.調用Session的invalidate方法強制銷毀。
3.jsp服務器重起或發生中斷(這個和tomcat服務器的配置有關(默認不銷毀,可以設置全部銷毀),重啟默認前會把session寫入文件里保存,重啟后會讀取session文件,所以session默認時間沒過還是存在的)
注意:關閉瀏覽器並不會銷毀session,默認下次開啟瀏覽器會新建session,但是舊的session會在最大無活動等待時間后自動執行銷毀。(文章后面教如何實現一直使用同一個session)
1.3 Session怎么識別用戶(服務器怎么識別/區分用戶):
Session需要使用Cookie作為識別標志。HTTP協議是無狀態的,Session不能依據HTTP連接來判斷是否為同一客戶,因此服務器向客戶端瀏覽器發送一個名為JSESSIONID的Cookie,它的值為該Session的id(HttpSession.getId()的返回值)。Session依據該Cookie來識別是否為同一用戶。
具體:當你第一次訪問一個網站的時候,網站服務器會在響應頭內加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服務器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服務器)信息,此信息是服務器隨機生成的,放在服務器內存里,為了標識唯一的客戶端用戶,內容不會重復,這就是sessionid.該Cookie為服務器自動生成的,它的maxAge屬性一般為-1,表示僅當前瀏覽器內有效,並且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。因此同一機器的兩個瀏覽器窗口訪問服務器時,會生成兩個不同的Session。但是由瀏覽器窗口內的鏈接、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標等打開的窗口)除外。這類子窗口會共享父窗口的Cookie,因此會共享一個Session。
怎么實現關閉瀏覽器,再打開瀏覽器時候使用原來的session:
或者關閉瀏覽器,再打開瀏覽器還是登陸的狀態:
或者重新打開瀏覽器沒有新建session:
或者使用Cookie實現短時間內不用重新登陸(當然后台也沒有自動登陸,和自動登陸有區別):
方法:因為保存Sessionid的cookie是臨時的(瀏覽器關閉就會銷毀),所以我們自己手動創建一個持久化的cookie,用來保存sessionid;
//一下是持久化cookie,保存sessionid,實現關閉瀏覽器,重新打開還是使用原來的session session.setMaxInactiveInterval(2 * 3600); // Session保存兩小時 Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(2 * 3600); // 客戶端的JSESSIONID也保存兩小時 cookie.setPath("/"); response.addCookie(cookie);
(注意,第一次訪問時候遍歷cookie只有一個cookie,刷新第二次訪問遍歷卻有兩個cookie,我想:第一次訪問自動生成的臨時cookie還沒有返回給瀏覽器,第一次訪問結束了,瀏覽器才有了
臨時的cookie,和我們手動持久化的cookie,所以第二次訪問遍歷獲取了兩個cookie,都有相同的sessionid屬性。關閉瀏覽器,再訪問,遍歷只有一個cookie,因為臨時的cookie關閉瀏覽器時候銷毀了,
現在只使用持久化的cookie了,里面有sessionid屬性)
1.4 如果Cookie功能警用,我們怎么識別用戶?
Java Web提供了另一種解決方案:URL地址重寫。
URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務器能夠解析重寫后的URL獲取Session的id。這樣即使客戶端不支持Cookie,也可以使用Session來記錄用戶狀態。HttpServletResponse類提供了encodeURL(String url)實現URL地址重寫,該方法會自動判斷客戶端是否支持Cookie。如果客戶端支持Cookie,會將URL原封不動地輸出來。如果客戶端不支持Cookie,則會將用戶Session的id重寫到URL中。
注意:TOMCAT判斷客戶端瀏覽器是否支持Cookie的依據是請求中是否含有Cookie。盡管客戶端可能會支持Cookie,但是由於第一次請求時不會攜帶任何Cookie(因為並無任何Cookie可以攜帶),URL地址重寫后的地址中仍然會帶有jsessionid。當第二次訪問時服務器已經在瀏覽器中寫入Cookie了,因此URL地址重寫后的地址中就不會帶有jsessionid了。