0
我想在瀏覽器上打開網頁時保持會話仍然活着,即使長時間沒有觸摸它,我也會這樣做:通過調用jsp發送heartbeart不會保持會話活動
- 在服務器端(tomcat),會話超時設置爲8分鐘。
- main jsp生成一個html。在這個html中,我使用計時器& ajax每3分鐘致電
heartbeat.jsp
&也將初始會話ID的值傳遞給它。 - 在
heartbeat.jsp
,我轉儲session.getId()
的值&初始會話ID。
[執行結果的時間表]:
10:00
我打開頁 - 主JSP程序產生客戶端的HTML10:03
heartbeat.jsp
稱爲 -session.getId()
=初始會話ID10:06
heartbeat.jsp
稱爲 -session.getId()
=初始會話ID10:09
heartbeat.jsp
稱爲 -session.getId()
<>初始會話ID
inital會話ID的上次訪問時間爲10:06
,所以初始會話ID的超時時間是在10:14
應該。但爲什麼在10:09
,session.getId()
得到另一個新的ID?
看起來前2個調用沒有重置服務器端的初始會話超時計數器。我在IE和Firefox上都測試了這兩個結果,他們有相同的結果
我該如何讓session保持良好狀態?
[主JSP代碼賽格]:
<script type="text/javascript" src="/fp/js/prototype.js"></script>
<script type="text/javascript" src="/fp/js/jquery.min.js"></script>
<script type="text/javascript" src="/fp/js/jquery.roundabout.min.js"></script>
<script type="text/javascript">
function heartbeats(sid) {
var url = '/test/heartbeat.jsp' + '?rn=' + Math.random() +'&mysid='+sid;
var myAjax = new Ajax.Request(url,{
method: 'get',
onFailure: function(request) {
alert("connect problem, can't do heartbeat!");
},
onSuccess: function(response) {
if (response.responseText.indexOf("timeout") != -1) {
alert("original session is expired");
}
}
});
}
function init_heartbeat(sid) {
new PeriodicalExecuter(function(startHeart){heartbeats(sid);}, 60*3);
}
init_heartbeat("<%=session.getId()%>");
</script>
[heartbeat.jsp代碼賽格]:
String server_sid = (String)session.getId();
String client_sid =
request.getParameter("mysid")==null?"":(String)request.getParameter("mysid");
java.util.Calendar calendar = java.util.Calendar.getInstance();
File lf = new File("/usr/tmp/hb.log");
try {
lf.println("servre sid = "+server_sid);
lf.println("client sid = "+client_sid);
lf.println("~~~~~");
lf.close();
} catch(Exception e) {
out.print(e);
}
if(!server_sid.equals(client_sid))
out.print("timeout");
您是否需要發送sessionid與您的請求?對不起,因爲jsp太久了,但我認爲那裏有sessionid參數 – Alex 2011-02-11 20:13:06