Session一直是我們做web項(xiàng)目經(jīng)常使用的,以前沒(méi)太注意,這次又細(xì)致的看了下!
1.session其實(shí)就是一個(gè)Map,鍵=值對(duì),通過(guò)session.getAttribute("name");獲得session中設(shè)置的參數(shù)
2.session的過(guò)期時(shí)間是從什么時(shí)候開(kāi)始計(jì)算的?是從一登錄就開(kāi)始計(jì)算還是說(shuō)從停止活動(dòng)開(kāi)始計(jì)算?
答:從session不活動(dòng)的時(shí)候開(kāi)始計(jì)算,如果session一直活動(dòng),session就總不會(huì)過(guò)期。
從該Session未被訪問(wèn),開(kāi)始計(jì)時(shí); 一旦Session被訪問(wèn),計(jì)時(shí)清0;
3.設(shè)置session的失效時(shí)間
a) web.xml中
<session-config> <session-timeout>30</session-timeout> </session-config>//單位為分鐘b) 在程序中手動(dòng)設(shè)置
session.setMaxInactiveInterval(30 * 60);//設(shè)置單位為秒,設(shè)置為-1永不過(guò)期
c) tomcat也可以修改session過(guò)期時(shí)間,在server.xml中定義context時(shí)采用如下定義:
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>4.如何判斷session過(guò)沒(méi)過(guò)期
1) 以前是根據(jù) if(session.getAttribute('user')==null)判斷是否為空
=========================================================================================
2) 如下為看到的一個(gè)帖子,判斷session不為空的好方法:
request.getSeesion(boolean)方法,一下子讓我恍然大悟。這個(gè)方法里面?zhèn)髁艘粋€(gè)boolean值,這個(gè)值如果是true,那么如 果當(dāng)前的request的session不可用,那么就創(chuàng)建新的會(huì)話,如果存在就返回當(dāng)前的會(huì)話。如果參數(shù)是false,那么在request的當(dāng)前會(huì)話不存在的時(shí)候就返回null。 這樣我們就可以很容易的聯(lián)想到這個(gè)所謂的request的當(dāng)前會(huì)話是否存在和session過(guò)期的聯(lián)系,所以我們就可以“近似地”認(rèn)為session不存在就是session過(guò)期了,那么我們就可以很容易地判斷session是否過(guò)期了。方法如下:
if(request.getSession(false)==null){ System.out.PRintln("Session has been invalidated!"); }else{ System.out.println("Session is active!"); }可能大家注意到我上面有一個(gè)“近似地”字眼,也就是說(shuō)存在特別情況。 這個(gè)特殊情況就是第一次請(qǐng)求還沒(méi)有創(chuàng)建會(huì)話的時(shí)候,那么用這個(gè)方法返回的仍然是null,原因我想大家應(yīng)該是顯然的。 也有很多人覺(jué)得應(yīng)該使用javax.servlet.http.HttpSessionBindingListener接口來(lái)實(shí)現(xiàn)類似功能。 他們的意思是當(dāng)session創(chuàng)建的時(shí)候session.setAttribute("isActive","yes");只要session沒(méi)有過(guò)期,那么我們就可以 session.getAttribute("isActive")==null來(lái)判斷,但是我們?nèi)绻谶^(guò)期以后就不能用這個(gè)辦法了,因?yàn)槲覀兪褂眠^(guò)期的session.getAttribute()方法就會(huì)拋出java.lang.IllegalStateException,這時(shí)候我們就只能通過(guò)捕捉這個(gè)異常來(lái)進(jìn)行判斷,這就會(huì)打亂我們整個(gè)程序的邏輯流程。 當(dāng)然我們也可以在session過(guò)期的時(shí)候這樣處理,在HttpSessionBindingListener接口的onValueUnbound()方法里面通過(guò)設(shè)置一個(gè)flag來(lái)標(biāo)志session已過(guò)期,之后都使用這個(gè)flag,那么這個(gè)flag一定是要放在application里面,application是HttpServletContex類的對(duì)象,所以我們必須對(duì)這個(gè)flag加入是哪個(gè)session過(guò)期的信息,這樣一來(lái)整個(gè)的過(guò)程就十分麻煩。 關(guān)于用監(jiān)聽(tīng)器實(shí)現(xiàn)我要補(bǔ)充一點(diǎn),我的方法是站在某一個(gè)session的角度來(lái)實(shí)現(xiàn)的。如果說(shuō)要監(jiān)測(cè)多個(gè)session就應(yīng)該站在application的角度來(lái)分析,這時(shí)候的最佳選擇就是HttpSessionBindingListener或者HttpSessionListener。 寫(xiě)這個(gè)帖子的目的就是讓大家在需要判斷的時(shí)候(不管session是否過(guò)期都OK)用這樣的一條語(yǔ)句來(lái)簡(jiǎn)單的實(shí)現(xiàn)功能,至于意義我們姑且不談。
來(lái)自:http://www.educity.cn/wenda/121809.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注