本文小編為大家詳細介紹“Session超時問題怎么解決”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Session超時問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的景泰網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
眾所周知,當用戶登錄網(wǎng)站后較長一段時間沒有與服務(wù)器進行交互,將會導(dǎo)致服務(wù)器上的用戶會話數(shù)據(jù)(即session)被銷毀。此時,當用戶再次操作網(wǎng)頁時,如果服務(wù)器進行了session校驗,那么瀏覽器將會提醒用戶session超時。
那么,如何解決用戶登錄后較長時間未操作而導(dǎo)致的session失效的問題呢?
導(dǎo)致這個問題的關(guān)鍵詞有兩個:一個是“長時間”,一個是“未操作”。
1.如果用戶未操作的“長時間”超過了服務(wù)器配置的session超時時間,并導(dǎo)致session失效,那么我們延長session的超時時間,讓用戶原來的“長時間”與超時時間相比,變得不“長”,不就可以解決了嗎?
2.如果用戶是長時間“未操作”導(dǎo)致session失效,那么我們想辦法產(chǎn)生“操作”,讓用戶每隔一小段時間就“操作”一次,與服務(wù)器產(chǎn)生交互,那么session自然也不會失效。
一般情況下下,我們首先想到的是,通過改變服務(wù)器的配置,延長服務(wù)器的session超時時間。
例如,在Tomcat服務(wù)器的web.xml文件中有如下節(jié)點內(nèi)容:
30
這里的30表示session的超時時間,單位為分鐘,如果用戶登錄后在30分鐘內(nèi)沒有與服務(wù)器交互,那么當前用戶的session將失效。我們可以配置一個更大的數(shù)值(比如60),就可以延長session的超時時間,如果將該值改為0或負數(shù)的話,則表示session永不失效。
不過在實際的工作應(yīng)用中,一味地上調(diào)session的超時時間設(shè)置并不怎么常見,大多數(shù)需要實現(xiàn)該功能的網(wǎng)站都將解決問題的焦點集中在第二條思路上。例如:一些在線網(wǎng)站均采用定時刷新頁面的方法來防止session超時。
定時刷新頁面,最常見的有兩種實現(xiàn)方式:一種是通過JavaScript + HTML DOM,另一種則是通過meta標簽來實現(xiàn)。
function refresh(seconds){ setTimeout("self.location.reload()", seconds * 1000); } refresh(600); //調(diào)用方法啟動定時刷新,數(shù)值單位:秒。
在頁面中添加meta標簽refresh也可以指定每隔指定時間就刷新當前頁面,示例代碼如下:
上述meta標簽可以實現(xiàn)每過600秒就刷新一次當前頁面。
在上述兩種方案中,較好的為第二種,因為如果當前頁面是在IE瀏覽器的模式窗口中打開的,默認情況下,self.location.reload()
方法將會失效,而refresh meta標簽在IE模式窗口下仍然有效。
上述兩種方式都實現(xiàn)了刷新當前頁面,并且使用起來非常簡單,不過很遺憾的是,它們存在一種幾乎致命的缺陷。 試想一下,如果在論壇發(fā)帖等需要用戶輸入內(nèi)容的頁面,用戶花費較長的時間輸入了許多文本內(nèi)容,可是突然遇到了一個定時頁面刷新,結(jié)果用戶輸入的所有內(nèi)容都沒了,估計這個時候用戶連掐死你的心都有了……
因此我們需要在當前頁面本身不刷新、不影響用戶的任何操作的情況下實現(xiàn)定時刷新。最常見的解決方法仍然有兩種。
一種是在當前頁面添加一個隱藏的iframe
,然后在該iframe
里面實現(xiàn)定時刷新。
此外,我們需要在服務(wù)器上編寫對應(yīng)的請求響應(yīng)代碼,例如ping.php
中可以編寫如下代碼: