Session的生命周期(同一瀏覽器,無論關閉與否,使用同一個session會話,直到session銷毀)


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了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM