關於Session過期和失效


20:02:47

  Session雖然我們經常在用,但以前對此理解不深,今天特別整理如下:

    1.什么是Session?

                   session其實就是一個Map,【鍵=值】對,通過session.getAttribute("name");

                    獲得session中設置的參數。

    2.session的過期時間是從什么時候開始計算的?是從一登錄就開始計算還是說從停止活動開始計算?

      從session不活動的時候開始計算,如果session一直活動,session就總不會過期。

                  從該Session未被訪問,開始計時,一旦Session被訪問, 計時清零。   

    3.設置session的失效時間

  a)web.xml中 

   <session-config> <session-timeout>30</session-timeout> </session-config>

  b)在程序中手動設置

     session.setMaxInactiveInterval(30 * 60);  //設置單位為秒,設置為-1永不過期

  c)tomcat也可以修改session過期時間,在server.xml中定義context時采用如下定義:          

<Context path="/livsorder" docBase="/home/httpd/html/livsorder"    defaultSessionTimeOut="3600" isWARExpanded="true"    isWARValidated="false"    isInvokerEnabled="true"    isWorkDirPersistent="false"
/>

          4.如何判斷session是否過期

    a)以前是根據 if(session.getAttribute('user')==null)判斷是否為空

    b)  如下為看到的一個帖子,判斷session不為空的好方法:

  request.getSeesion(boolean)這個方法里面傳了一個boolean值。

      這個值如果是true,那么如果當前的request的session不可用,那么就創建新的Session,如果存在就返回當前的Session。

      如果參數是false,那么在request的當前會話不存在的時候就返回null。

      這樣我們就可以很容易的聯想到這個所謂的request的當前會話是否存在和session過期的聯系,所以我們就可以“近似地”認為session

      不存在就是session過期了,那么我們就可以很容易地判斷session是否過期了。方法如下:

if(request.getSession(false)==null){ System.out.println("Session has been invalidated!");
}
else {
     System.out.println("Session is active!");
} 

 

可能大家注意到我上面有一個“近似地”字眼,也就是說存在特別情況。這個特殊情況就是第一次請求還沒有創建會話的時候,那么用這個方法返回的仍然是null。


也有很多人覺得應該使用javax.servlet.http.HttpSessionBindingListener接口來實現類似功能。
他們的意思是當session創建的時候session.setAttribute("isActive","yes");只要session沒過期,那么我們就可以session.getAttribute("isActive")==null 來判斷,但是我們如果在過期以后就不能用這個辦法了,因為我們使用過期的session.getAttribute()方法就會拋出java.lang.IllegalStateException,這時候我們就只能通過捕捉這個異常來進行判斷,這就會打亂我們整個程序的邏輯流程。

當然我們也可以在session過期的時候這樣處理,在HttpSessionBindingListener接口的onValueUnbound()方法里面通過設置一個flag來標志session已過期,之后盤都使用這個flag,那么這個flag一定是要放在application里面,application是HttpServletContex類的對象,所以我們必須對這個flag加入是哪個session過期的信息,這樣一來整個過程就十分麻煩。

關於用監聽器實現我要補充一點,我的方法是站在某一個session的角度來實現的。如果說要監測多個session就應該站在application的角度來分析,這時候的最佳選擇就是HttpSessionBindingListener或者HttpSessionListener

寫這個帖子的目的就是讓大家在需要判斷的時候(不管session是否過期都OK)用這樣的一條語句來簡單的實現功能,至於意義我們姑且不談。    


免責聲明!

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



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