Session過時、失效時間

  1.session其實就是一個Map,key=value,經過session.getAttribute("name");得到session中設置的參數html

  2.session的過時時間是從何時開始計算的?是從一登陸就開始計算仍是說從中止活動開始計算?java

  從session不活動的時候開始計算,若是session一直活動,session就總不會過時。從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;web

  3.設置session的失效時間tomcat

  a)web.xml中session

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

  b)在程序中手動設置server

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

  c)tomcat也能夠修改session過時時間,在server.xml中定義context時採用以下定義:htm

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

  4.如何判斷session過沒過時

  1.一個是根據 if(session.getAttribute('user')==null)判斷是否爲空

  2.另外一個判斷session不爲空的方法:

  request.getSeesion(boolean)方法,這個方法裏面傳了一個boolean值,
  這個值若是是true,那麼若是當前的request的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

相關文章
相關標籤/搜索