眾所周知,當用戶登錄網站后較長一段時間沒有與服務器進行交互,將會導致服務器上的用戶會話數據(即session)被銷毀。此時,當用戶再次操作網頁時,如果服務器進行了session校驗,那么瀏覽器將會提醒用戶session超時,導致這個問題的關鍵詞有兩個:一個是「長時間」,一個是「未操作」。
防止session超時,我們一般采用的方式有兩種:1、延遲session超時時間 2、(在規定的session超時時間內)隔一定時間與服務器交互。
一、 延長服務器的session超時時間。ps:在Tomcat服務器的WEB.xml有如下節點內容:
<session-config><session-timeout>30</session-timeout></session-config>;
這里的30表示session的超時時間,單位為分鍾,如果用戶登錄后在30分鍾內沒有與服務器交互,
那么當前用戶的session將失效。我們可以配置一個更大的數值(比如60),
就可以延長session的超時時間,如果將該值改為0或負數的話,則表示session永不失效。
不過在實際的工作應用中,一味地上調session的超時時間設置並不怎么常見,
大多數需要實現該功能的網站都將解決問題的焦點集中在另一種思路上。
例如:一些在線網站均采用定時刷新頁面的方法來防止session超時。
二、定時刷新頁面。最常見的有兩種實現方式:一種是通過JavaScript+HTMLDOM,另一種則是通過meta標簽來實現。
1)JavaScript+HTMLDOM,示例代碼如下:
function refresh(seconds) { setTimeout("self.location.reload()",seconds*1000); } refresh(600);//調用方法啟動定時刷新,數值單位:秒。
2)通過meta標簽來實現(在頁面中添加meta標簽refresh也可以指定每隔指定時間就刷新當前頁面),示例代碼如下:
<metahttp-equiv="refresh"content="600"/>
上述meta標簽可以實現每過600秒就刷新一次當前頁面。
在上述兩種方案中,較好的為第二種,因為如果當前頁面是在IE瀏覽器的模式窗口中打開的,默認情況下,
self.location.reload()方法將會失效,而refreshmeta標簽在IE模式窗口下仍然有效。
上述兩種方式都實現了刷新當前頁面,並且使用起來非常簡單,不過很遺憾的是,它們存在一種幾乎致命的缺陷。試想一下,如果在論壇發帖等需要用戶輸入內容的頁面,用戶花費較長的時間輸 入了許多文本內容,可是突然遇到了一個定時頁面刷新,結果用戶輸入的所有內容都沒了,估計這個時候用戶連掐死你的心都有了……
因此我們需要在當前頁面本身不刷新、不影響用戶的任何操作的情況下實現定時刷新。最常見的解決方法仍然有兩種。
1、在當前頁面添加一個隱藏的iframe,然后在該iframe里面實現定時刷新。
2、使用JavaScript Image對象來實現定時刷新,(服務器的響應可以是文字等非圖片內容,非圖片內容只會造成圖像加載失敗,而我們的圖像標簽本身就是隱藏的,不管是加載成功還是失敗都不 會顯示,畢竟我們的主要目的是發送請求給服務器,讓服務器保持session處於活動狀態。)
3、使用Ajax來實現定時刷新。
使用說明: