Mặc định session sẽ timeout trong vòng 20’, thế nhưng đâu phải lúc nào cũng mặc định là như vậy, session có thể timeout trong vòng vài phút.
1 trong những cách thường gặp nhất để giử cho session tiếp tục sống (alive) là request định kỳ tới 1 trang nào đó, ví dụ trong khoảng thời gian định kỳ 60’ chẳng hạn, trong bài này mình sẽ hướng dẫn các bạn làm thế nào để giử cho session is alive sử dụng javascript (jquery và prototype).
Đầu tiên mình sẽ tạo 1 trang, trang này được request theo định kỳ 5 giây (mục đích test).
Tạo mới 1 trang KeepSessionAlive.ashx và đặt ở root
<%@ WebHandler Language="C#" Class="KeepSessionAlive" %>
using System;
using System.Web;
public class KeepSessionAlive : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
context.Response.Write("Session is alive");
}
public bool IsReusable {
get {
return false;
}
}
}
Prototype
Bởi việc tạo 1 instance Ajax Request và truyền vào đường dẫn tới 1 trang cần request, phương thức request, các tham số onRequest và onSuccess là tùy chọn, trong đó onSuccess nhận về là 1 phương thức dùng để kiểm liệu request đã tạo có thành công hay không?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>How to keep session is alive using prototype</title>
<script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"
type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function KeepSessionAlive() {
new Ajax.Request('KeepSessionAlive.ashx', {
method: 'post',
onSuccess: function (transport) {
var ret = $('result');
var temp = ret.innerHTML;
ret.update(temp + '</br>' + transport.responseText);
}
});
}
setInterval(KeepSessionAlive, 5000);
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="result">
</div>
</form>
</body>
</html>
Nếu dùng firebug để trace request chúng ta cũng thấy được mỗi request đã được made cứ mỗi 5 giây

Jquery:
Sử dụng Jquery sẽ đơn giản hơn trong việc giử 1 request với phương thức post lên server và kết quả nhận về sẽ được update vào thẻ div.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function KeepSessionAlive() {
// 1. Make request to server
$.post('KeepSessionAlive.ashx', function (data) {
var ret = $('#result');
var temp = ret.html();
ret.append(data + '</br>');
});
}
setInterval(KeepSessionAlive, 5000);
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="result">
</div>
</form>
</body>
</html>
Chú ý: chúng ta có thể thiết lập lại thời gian interval cho mỗi lần request bao nhiêu tùy ý, ở đây với mục đích test, mình đã thiết lập định kỳ là 5 giây.
Check out my code: http://code2code.googlecode.com/svn/trunk/SessionKeepAlive
Chúc thành công.