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