大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專(zhuān)注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Session超時(shí)問(wèn)題詳解

Session超時(shí)問(wèn)題詳解

更新時(shí)間:2021-08-04 16:18:33 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3649次

眾所周知,當(dāng)用戶登錄網(wǎng)站后較長(zhǎng)一段時(shí)間沒(méi)有與服務(wù)器進(jìn)行交互,將會(huì)導(dǎo)致服務(wù)器上的用戶會(huì)話數(shù)據(jù)(即session)被銷(xiāo)毀。此時(shí),當(dāng)用戶再次操作網(wǎng)頁(yè)時(shí),如果服務(wù)器進(jìn)行了session校驗(yàn),那么瀏覽器將會(huì)提醒用戶session超時(shí)。

那么,如何解決用戶登錄后較長(zhǎng)時(shí)間未操作而導(dǎo)致的session失效的問(wèn)題呢?

導(dǎo)致這個(gè)問(wèn)題的關(guān)鍵詞有兩個(gè):一個(gè)是“長(zhǎng)時(shí)間”,一個(gè)是“未操作”。

1.如果用戶未操作的“長(zhǎng)時(shí)間”超過(guò)了服務(wù)器配置的session超時(shí)時(shí)間,并導(dǎo)致session失效,那么我們延長(zhǎng)session的超時(shí)時(shí)間,讓用戶原來(lái)的“長(zhǎng)時(shí)間”與超時(shí)時(shí)間相比,變得不“長(zhǎng)”,不就可以解決了嗎?

2.如果用戶是長(zhǎng)時(shí)間“未操作”導(dǎo)致session失效,那么我們想辦法產(chǎn)生“操作”,讓用戶每隔一小段時(shí)間就“操作”一次,與服務(wù)器產(chǎn)生交互,那么session自然也不會(huì)失效。

一般情況下下,我們首先想到的是,通過(guò)改變服務(wù)器的配置,延長(zhǎng)服務(wù)器的session超時(shí)時(shí)間。

例如,在Tomcat服務(wù)器的web.xml文件中有如下節(jié)點(diǎn)內(nèi)容:

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

這里的30表示session的超時(shí)時(shí)間,單位為分鐘,如果用戶登錄后在30分鐘內(nèi)沒(méi)有與服務(wù)器交互,那么當(dāng)前用戶的session將失效。我們可以配置一個(gè)更大的數(shù)值(比如60),就可以延長(zhǎng)session的超時(shí)時(shí)間,如果將該值改為0或負(fù)數(shù)的話,則表示session永不失效。

不過(guò)在實(shí)際的工作應(yīng)用中,一味地上調(diào)session的超時(shí)時(shí)間設(shè)置并不怎么常見(jiàn),大多數(shù)需要實(shí)現(xiàn)該功能的網(wǎng)站都將解決問(wèn)題的焦點(diǎn)集中在第二條思路上。例如:一些在線網(wǎng)站均采用定時(shí)刷新頁(yè)面的方法來(lái)防止session超時(shí)。

定時(shí)刷新頁(yè)面,最常見(jiàn)的有兩種實(shí)現(xiàn)方式:一種是通過(guò)JavaScript + HTML DOM,另一種則是通過(guò)meta標(biāo)簽來(lái)實(shí)現(xiàn)。

function refresh(seconds){
    setTimeout("self.location.reload()", seconds * 1000);
}
refresh(600);  //調(diào)用方法啟動(dòng)定時(shí)刷新,數(shù)值單位:秒。

在頁(yè)面中添加meta標(biāo)簽refresh也可以指定每隔指定時(shí)間就刷新當(dāng)前頁(yè)面,示例代碼如下:

<meta http-equiv="refresh" content="600" />

上述meta標(biāo)簽可以實(shí)現(xiàn)每過(guò)600秒就刷新一次當(dāng)前頁(yè)面。

在上述兩種方案中,較好的為第二種,因?yàn)槿绻?dāng)前頁(yè)面是在IE瀏覽器的模式窗口中打開(kāi)的,默認(rèn)情況下,self.location.reload()方法將會(huì)失效,而refresh meta標(biāo)簽在IE模式窗口下仍然有效。

上述兩種方式都實(shí)現(xiàn)了刷新當(dāng)前頁(yè)面,并且使用起來(lái)非常簡(jiǎn)單,不過(guò)很遺憾的是,它們存在一種幾乎致命的缺陷。 試想一下,如果在論壇發(fā)帖等需要用戶輸入內(nèi)容的頁(yè)面,用戶花費(fèi)較長(zhǎng)的時(shí)間輸入了許多文本內(nèi)容,可是突然遇到了一個(gè)定時(shí)頁(yè)面刷新,結(jié)果用戶輸入的所有內(nèi)容都沒(méi)了,估計(jì)這個(gè)時(shí)候用戶連掐死你的心都有了……

因此我們需要在當(dāng)前頁(yè)面本身不刷新、不影響用戶的任何操作的情況下實(shí)現(xiàn)定時(shí)刷新。最常見(jiàn)的解決方法仍然有兩種。
一種是在當(dāng)前頁(yè)面添加一個(gè)隱藏的iframe,然后在該iframe里面實(shí)現(xiàn)定時(shí)刷新。

<iframe id="hidden_iframe" style="display:none;" scrolling="no" frameborder="0" name=" hidden_iframe " src="ping.php"></iframe>

此外,我們需要在服務(wù)器上編寫(xiě)對(duì)應(yīng)的請(qǐng)求響應(yīng)代碼,例如ping.php中可以編寫(xiě)如下代碼:

<?php
//每隔600秒刷新當(dāng)前頁(yè)面
echo '<html><head><meta http-equiv="refresh" content="600" /></head><body></body></html>';
?>
另外一種則是使用JavaScript Image對(duì)象來(lái)實(shí)現(xiàn)定時(shí)刷新,JavaScript代碼如下:

function autoRefresh(seconds){
    if(typeof period == "undefined"){   //如果是第一次執(zhí)行
        period = seconds * 1000;    //定義全局變量period
        var bodyDOM = document.getElementsByTagName("body")[0];
        if(bodyDOM){
            bodyDOM.innerHTML += '<img id="auto_refresh_img" src="" style="display:none" />';   //添加隱藏的圖片
            imgDOM = document.getElementById("auto_refresh_img");   //定義全局Image對(duì)象
        }
    }
    if(typeof imgDOM != "undefined"){
        imgDOM.src = "ping.php?sid=" + new Date().getTime();    //防止緩存
        setTimeout("autoRefresh(" + seconds + ")", period);     
    }
}
autoRefresh(600);   //調(diào)用方法啟動(dòng)定時(shí)刷新

和使用iframe來(lái)實(shí)現(xiàn)定時(shí)刷新一樣,使用JavaScript Image對(duì)象實(shí)現(xiàn)定時(shí)刷新,也需要在服務(wù)器端編寫(xiě)類(lèi)似的請(qǐng)求響應(yīng)代碼。服務(wù)器的響應(yīng)可以是文字等非圖片內(nèi)容,非圖片內(nèi)容只會(huì)造成圖像加載失敗,而我們的圖像標(biāo)簽本身就是隱藏的,不管是加載成功還是失敗都不會(huì)顯示,畢竟我們的主要目的是發(fā)送請(qǐng)求給服務(wù)器,讓服務(wù)器保持session處于活動(dòng)狀態(tài)。

當(dāng)然,我們還可以使用Ajax來(lái)實(shí)現(xiàn)定時(shí)刷新,不過(guò)使用Image對(duì)象會(huì)更好一些,因?yàn)橛行├鲜綖g覽器的JavaScript無(wú)法實(shí)現(xiàn)Ajax,但是卻可以使用Image對(duì)象。此外,使用Ajax需要編寫(xiě)更多的代碼來(lái)處理XMLHttpRequest等對(duì)象的活動(dòng)。

在上述兩種方式中,各有其優(yōu)缺點(diǎn)。

使用iframe標(biāo)簽實(shí)現(xiàn)定時(shí)刷新的優(yōu)點(diǎn)是:不需要編寫(xiě)JavaScript代碼,可以在瀏覽器禁用JavaScript的情況下實(shí)現(xiàn)定時(shí)刷新;其缺點(diǎn)是:在某些不支持iframe標(biāo)簽的老式瀏覽器中沒(méi)有效果,此外,iframe標(biāo)簽在瀏覽器中新增加了一個(gè)獨(dú)立的頁(yè)面,即使沒(méi)有顯示出來(lái),不過(guò)其內(nèi)部解析的windowdocument等對(duì)象仍然存在,占用的瀏覽器內(nèi)存相對(duì)較多。

使用Image對(duì)象的優(yōu)點(diǎn)是:與iframe相比,占用的內(nèi)存相對(duì)較少,支持Image的瀏覽器也相對(duì)較多(現(xiàn)代瀏覽器均支持);缺點(diǎn)是:在瀏覽器禁用JavaScript的情況下就毫無(wú)用武之地了。

開(kāi)發(fā)人員應(yīng)根據(jù)實(shí)際需求情況來(lái)確定使用何種實(shí)現(xiàn)方式更好。此外,服務(wù)器在響應(yīng)定時(shí)刷新的請(qǐng)求時(shí),在滿足要求的情況下,應(yīng)返回盡可能少的數(shù)據(jù),以節(jié)省帶寬。

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Session超時(shí)問(wèn)題詳解",希望對(duì)大家有幫助,想了解更多可查看Session執(zhí)行原理。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 看特级大黄一片 | 精品视频网站 | 深夜网站在线 | 97天天做天天爱夜夜爽 | 欧美一区二区三区久久久人妖 | 欧美色p| 国产福利在线观看精品 | 四虎影视最新网址 | 久久伊人久久亚洲综合 | 激情久久免费视频 | 亚洲精品亚洲一区二区 | 国产精品18久久久久久小说 | 亚洲九九精品 | 色www精品视频在线观看 | 天天综合天天做 | 中文字幕一区二区三区免费视频 | 国产一区二区三区在线观看精品 | 99免费在线视频 | 日韩一区二区在线免费观看 | 波多野吉衣一区二区三区在线观看 | 国内精品小视频在线 | 亚洲日本在线播放 | 中文字幕久精品免费视频蜜桃视频 | 国产精品.com | 精品视频在线视频 | 免费亚洲视频在线观看 | 欧美一级α片毛片免费观看 | 人人干人| www.涩| 皮皮在线精品亚洲 | 国产一级毛片在线 | 色老成人精品视频在线观看 | 在线国产一区二区三区 | 久久精品国产精品亚洲毛片 | 黄片毛片 | 亚洲高清中文字幕一区二区三区 | 狠狠舔| 搜一级毛片 | 亚洲精品视频二区 | 欧美日韩中文字幕一区二区高清 | 不卡国产视频 |