眾所周知,當用戶登錄網站后較長一段時間沒有與服務器進行交互,將會導致服務器上的用戶會話數據(即session)被銷毀。此時,當用戶再次操作網頁時,如果服務器進行了session校驗,那么瀏覽器將會提醒用戶session超時。
那么,如何解決用戶登錄后較長時間未操作而導致的session失效的問題呢?
導致這個問題的關鍵詞有兩個:一個是“長時間”,一個是“未操作”。
1.如果用戶未操作的“長時間”超過了服務器配置的session超時時間,并導致session失效,那么我們延長session的超時時間,讓用戶原來的“長時間”與超時時間相比,變得不“長”,不就可以解決了嗎?
2.如果用戶是長時間“未操作”導致session失效,那么我們想辦法產生“操作”,讓用戶每隔一小段時間就“操作”一次,與服務器產生交互,那么session自然也不會失效。
一般情況下下,我們首先想到的是,通過改變服務器的配置,延長服務器的session超時時間。
例如,在Tomcat服務器的web.xml文件中有如下節點內容:
<session-config><session-timeout>30</session-timeout></session-config>
這里的30表示session的超時時間,單位為分鐘,如果用戶登錄后在30分鐘內沒有與服務器交互,那么當前用戶的session將失效。我們可以配置一個更大的數值(比如60),就可以延長session的超時時間,如果將該值改為0或負數的話,則表示session永不失效。
不過在實際的工作應用中,一味地上調session的超時時間設置并不怎么常見,大多數需要實現該功能的網站都將解決問題的焦點集中在第二條思路上。例如:一些在線網站均采用定時刷新頁面的方法來防止session超時。
定時刷新頁面,最常見的有兩種實現方式:一種是通過JavaScript + HTML DOM,另一種則是通過meta標簽來實現。
functionrefresh(seconds){setTimeout("self.location.reload()",seconds*1000);}refresh(600);//調用方法啟動定時刷新,數值單位:秒。
在頁面中添加meta標簽refresh也可以指定每隔指定時間就刷新當前頁面,示例代碼如下:
<metahttp-equiv="refresh"content="600"/>
上述meta標簽可以實現每過600秒就刷新一次當前頁面。
在上述兩種方案中,較好的為第二種,因為如果當前頁面是在IE瀏覽器的模式窗口中打開的,默認情況下,self.location.reload()
方法將會失效,而refresh meta標簽在IE模式窗口下仍然有效。
上述兩種方式都實現了刷新當前頁面,并且使用起來非常簡單,不過很遺憾的是,它們存在一種幾乎致命的缺陷。 試想一下,如果在論壇發帖等需要用戶輸入內容的頁面,用戶花費較長的時間輸入了許多文本內容,可是突然遇到了一個定時頁面刷新,結果用戶輸入的所有內容都沒了,估計這個時候用戶連掐死你的心都有了……
因此我們需要在當前頁面本身不刷新、不影響用戶的任何操作的情況下實現定時刷新。最常見的解決方法仍然有兩種。
一種是在當前頁面添加一個隱藏的iframe
,然后在該iframe
里面實現定時刷新。
<iframeid="hidden_iframe"style="display:none;"scrolling="no"frameborder="0"name="hidden_iframe"src="ping.php"></iframe>
此外,我們需要在服務器上編寫對應的請求響應代碼,例如ping.php
中可以編寫如下代碼:
<?php//每隔600秒刷新當前頁面echo'<html><head><metahttp-equiv="refresh"content="600"/></head><body></body></html>';?>另外一種則是使用JavaScriptImage對象來實現定時刷新,JavaScript代碼如下:functionautoRefresh(seconds){if(typeofperiod=="undefined"){//如果是第一次執行period=seconds*1000;//定義全局變量periodvarbodyDOM=document.getElementsByTagName("body")[0];if(bodyDOM){bodyDOM.innerHTML+='<imgid="auto_refresh_img"src=""style="display:none"/>';//添加隱藏的圖片imgDOM=document.getElementById("auto_refresh_img");//定義全局Image對象}}if(typeofimgDOM!="undefined"){imgDOM.src="ping.php?sid="+newDate().getTime();//防止緩存setTimeout("autoRefresh("+seconds+")",period);}}autoRefresh(600);//調用方法啟動定時刷新
和使用iframe來實現定時刷新一樣,使用JavaScript Image對象實現定時刷新,也需要在服務器端編寫類似的請求響應代碼。服務器的響應可以是文字等非圖片內容,非圖片內容只會造成圖像加載失敗,而我們的圖像標簽本身就是隱藏的,不管是加載成功還是失敗都不會顯示,畢竟我們的主要目的是發送請求給服務器,讓服務器保持session處于活動狀態。
當然,我們還可以使用Ajax來實現定時刷新,不過使用Image對象會更好一些,因為有些老式瀏覽器的JavaScript無法實現Ajax,但是卻可以使用Image對象。此外,使用Ajax需要編寫更多的代碼來處理XMLHttpRequest等對象的活動。
在上述兩種方式中,各有其優缺點。
使用iframe標簽實現定時刷新的優點是:不需要編寫JavaScript代碼,可以在瀏覽器禁用JavaScript的情況下實現定時刷新;其缺點是:在某些不支持iframe標簽的老式瀏覽器中沒有效果,此外,iframe
標簽在瀏覽器中新增加了一個獨立的頁面,即使沒有顯示出來,不過其內部解析的window
、document
等對象仍然存在,占用的瀏覽器內存相對較多。
使用Image對象的優點是:與iframe
相比,占用的內存相對較少,支持Image的瀏覽器也相對較多(現代瀏覽器均支持);缺點是:在瀏覽器禁用JavaScript的情況下就毫無用武之地了。
開發人員應根據實際需求情況來確定使用何種實現方式更好。此外,服務器在響應定時刷新的請求時,在滿足要求的情況下,應返回盡可能少的數據,以節省帶寬。
讀到這里,這篇“Session超時問題怎么解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注本站行業資訊頻道。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
地量是什么意思?地量是股票的成交量處于較低的水平,判斷放量與縮量則看k線圖的紅綠色柱子,通過換手率,過量比還有成交量指標來看。地量在股票之中就是相對成交比較低的一種狀態,也是一種對比值,是相對于高位的天量來說,一旦是成交量到達頂端成交量的20%,也就進入到了地量的狀態。在一定的情況之下,股票的成交量出現明顯的下跌也就證明了不夠活躍,成交持續下跌,最終就會進入到地量狀態。漲停之后,買出單減少買入單增...
巴勒斯坦忍無可忍!如果你再忍下去,巴勒斯坦就會滅亡!近日,一張巴勒斯坦領土地圖在網上瘋傳。在這張地圖上,原本屬于巴勒斯坦的領土越來越少,而與以色列相鄰的領土越來越多。巴勒斯坦失去的每一寸土地都被以色列吞并了。據估計,按照這個速度,到2050年,巴勒斯坦可能已經從地球上消失,讓全世界頭疼的巴以矛盾也將徹底消失。因為未來以色列會吃掉并吞并所有的巴勒斯坦領土,巴勒斯坦會滅亡。在這一輪巴以沖突中,網上已經...
400億韓元等于多少人民幣?韓國硬幣最小單位是什么?40000000000韓元=206024400人民幣(約2.06億元人民幣)也就是說400億韓元可以兌換約2.06億元人民幣,需要說明的是,匯率每天都有波動,不等于每天都可以兌換這么多,有漲有跌,所以數據僅供大家參考,請以當天匯率為準。韓幣有紙幣和硬幣兩種。紙幣有1000韓元、5000韓元、10000韓元、50000韓元四種。韓國硬幣總共有1韓元...