国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

session詳細(xì)解析(是不是過(guò)期、失效時(shí)間)

2019-11-08 18:51:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
session詳細(xì)解析(是否過(guò)期、失效時(shí)間)

  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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上杭县| 云梦县| 房产| 清苑县| 和龙市| 界首市| 沧源| 广汉市| 南丹县| 望谟县| 大英县| 搜索| 三门县| 安仁县| 天峻县| 靖西县| 泰州市| 麻阳| 永德县| 丹阳市| 房产| 合山市| 米林县| 喜德县| 嘉荫县| 滦南县| 分宜县| 深圳市| 镇巴县| 中宁县| 平利县| 罗江县| 资溪县| 贵阳市| 汝城县| 乌拉特中旗| 沁水县| 赣州市| 南陵县| 诏安县| 上虞市|