1. 程式人生 > >那些年被誤導的 Session

那些年被誤導的 Session

       一開始我是拒絕的,說什麼 session 在瀏覽器關閉之後還在?開玩笑那我豈不是一直都被教錯而且還理解錯了?

       好吧,事實就是這樣,瀏覽器關閉銷燬的是 sessionId,在服務端的 session(只要沒超過設定的時間)依然存在,今天就來換個姿勢重新認識這個 Session:


為什麼關閉瀏覽器 session 還在?


       瀏覽器第一次訪問伺服器時,伺服器端會建立一個 session ,然後會將一個 sessionId 返回給瀏覽器,瀏覽器會儲存這個 sessionId。瀏覽器在下一次請求時會偷偷地攜帶上這個 sessionId,然後伺服器會把這個 sessionId 和自己記憶體中存放的 sessionId 進行對比,從而識別區分不同的客戶端。當瀏覽器關閉時,將會清除這個 sessionId,再次開啟瀏覽器訪問時由於請求不再攜帶 sessionId,所以伺服器端會再次建立一個 session,並把新的 sessionId 返回給瀏覽器。。。。(迴圈)


       說到這裡答案已經很明白了,因為伺服器沒辦法知道你是否關閉了瀏覽器,但是關閉瀏覽器會清除瀏覽器存放的 sessionId,從而導致再次開啟瀏覽器訪問時需要重新建立 session,所以會給你造成一個假象:"關閉瀏覽器 session 就被刪除了!",但事實是客戶端沒有 sessionId 和伺服器端的 sessionId 匹配了,再者 session 只能同時存在一個,那自然就只能重新再建立一個 session 咯。


什麼時候才會刪除 session?


       1、session 超時:指的是連續一定時間伺服器沒有接收到該 session 所對應的客戶端的請求,並且這個時間超過了伺服器設定的 session 的最大時間

       2、程式呼叫 HttpSession.invalidate()

       3、伺服器關閉或服務停止

       所以別再說什麼關閉瀏覽器 session 就去見上帝了。。。


為什麼關閉瀏覽器會清除 sessionId ?


       首先要明白一件事,sessionId 是以什麼形式存放在瀏覽器的?答案是:cookies

       既然是以 cookies 的形式存放,那就是說可以對它的存活期進行設定,那到底是誰給它的存活期設定成了關閉瀏覽器就銷燬??這裡以 Tomcat 建立 會話cookie(我們通常都將關閉瀏覽器時刪除的 cookies 稱為 "會話cookie",分不清"會話cookie"和"持久cookie"戳這裡

http://hhlux.iteye.com/blog/334729) 為例:

org.apache.catalina.connector.Request.java:

protected void configureSessionCookie(Cookie cookie) {  
    cookie.setMaxAge(-1);  
    String contextPath = null;  
    if (!connector.getEmptySessionPath() && (getContext() != null)) {  
        contextPath = getContext().getEncodedPath();  
    }  
    if ((contextPath != null) && (contextPath.length() > 0)) {  
        cookie.setPath(contextPath);  
    } else {  
        cookie.setPath("/");  
    }  
    if (isSecure()) {  
        cookie.setSecure(true);  
    }  
}

       答案就是這行程式碼:cookie.setMaxAge(-1);  它表示 cookies 在瀏覽器關閉時被刪除。


如何關閉瀏覽器再開啟還能保持登入狀態?


       上面已經提到了,sessionId 在客戶端是以 cookies 的形式儲存的,cookies 在不設定存活期的情況下是關閉瀏覽器就會刪除,所以說你完全可以給它設定一個時間,確保它可以儲存在本地一段時間,從而實現關閉瀏覽器後再開啟,請求伺服器端時還能記住你的登入狀態。

       當然這是建立在你的 session 沒過期的前提下的喔。而且肯定也不止這一種方法,別的方法和原理戳這裡:http://canann.iteye.com/blog/1687425


       事實證明,學東西還是要多動手啊!!!(多麼痛的領悟)