延長或控制Session的有效期的方法總結
如果訪問者在Session的設定的失效時間內(比如預設的20分鐘)沒有任何動作,Session就會失效,這個就意味著與Session存貯相關的變數也會同時失效,不能再訪問。有時候我們需要保持Session很長的時間來等待使用者完成工作,比如部落格,當用戶在寫完文章之後提交卻發現Session已經失效,這是一件多麼悲慘的事情。
很多人可能嘗試這樣做
<system.web>
<authenticationmode="Forms">
<forms timeout="60"/>
</authentication>
...
</system.web>
儘管我們可以很簡單的增加Session的過期時間,但是這並不是一個很好的方案。當用戶真的離開的時候,它會讓你的伺服器系統浪費很多記憶體資源來儲存一些完全沒有意義的東西。如果這個網站的訪問量非常大的時候,可能由於Session佔用的記憶體太多,而使你的網站執行得很慢。解決方案我們可以採用客戶端週期性請求伺服器的方法來保持Session。很多大型網站都是採用這樣的方法,例如網易,51部落格和QQ在寫郵件和發文章的時候。為了達到這樣的效果,我們可以使用javascript,jquery,metarefresh和asp.net ajax幾種方法來解決。
1. 用javascript來保持Session
Asp.net 僅僅會記住使用者的最後一次請求,它不知道使用者是否關閉了瀏覽器,或者是否在幹別的事情。為了保住那些還開著我們的網頁的使用者的Session,我們可以使用JS的setInterval功能
程式碼 <%--In this example, image will be used to keep session alive,
By changing image's src parameter, we'll make periodical requests
to web server.
counter =0;
function KeepSessionAlive() {
// Increase counter value, so we'll always get unique URL counter++;
// Gets reference of imagevar img = document.getElementById("imgSessionAlive");
// Set new src value, which will cause request to server, so// session will stay alive img.src ="http://YourWebSiteUrl.com/RefreshSessionState.aspx?c="+ counter;
// Schedule new call of KeepSessionAlive function after 60 seconds setTimeout(KeepSessionAlive, 60000);
}
// Run function for a first time KeepSessionAlive();
</script>
在這個例子裡,RefreshSessionState.aspx這個頁面將會每分鐘被請求一次。我們通過操作SRC來請求伺服器。當然這只是一個巧妙的方法,你可以使用Http Request.當然那更加的麻煩。如果你只是想保住Session的話你可以設定為19分鐘(19*60*1000=1140000)。當訪問的間隔很小時,比如例子的一分鐘,這樣做的好處是你可以準確的知道使用者的離開時間,並且立即釋放掉不需要使用的資源。你甚至可以把Session的過期時間定為2分鐘。這樣你的伺服器就只會儲存當前停留在你網站的使用者的Session.
因為RefreshSessionState.aspx頁面會被每分鐘請求,所以我們可以使用ASP.NET伺服器技術來追蹤我們的使用者,例如統計當前使用者數,使用者在看那一個頁面等等詳細資訊,如果是做一個社群性質的網站的話,相信這些會讓你的網站綻放光彩的。
2. 使用JQUERY 保持Session
我們可以使用Jquery框架來完成相同的任務。這裡我們使用Post提交方式來保持我們的Session
程式碼 <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script><script language="javascript" type="text/javascript">function KeepSessionAlive() {// 1. Make request to server $.post("http://YourWebSiteUrl.com/RefreshSessionState.aspx");
// 2. Schedule new request after 60000 miliseconds (1 minute) setInterval(KeepSessionAlive, 60000);
}
// Initial call of function KeepSessionAlive(); Â
</script>
Jquery的簡潔性是不是讓你眼紅呢?
3. 使用Meta Refresh來保持Session
一般我們不會用refresh來定時重新整理我們的整個頁面,因為這會造成你的頁面一閃一閃,這可不是一閃一閃亮晶晶,你要是一閃一閃的使用者早跑了。所以我們一般使用一個Iframe來完成這個功能
<iframe height="0" width="0" src="RefreshSessionState.aspx" frameborder="0" />
此時RefreshSessionState.aspx如果你不要跟蹤使用者的話不需要伺服器程式碼。我習慣於這樣寫
程式碼 <%@ Page Language="C#"%><html><head><%Response.Write(@"<meta http-equiv=""refresh"" content=""900;url=RefreshSessionState.aspx?x="+
Server.UrlEncode(DateTime.Now.ToString()) +@""" />");
%></head><body></body></html>
引數x的作用是為了避免瀏覽器快取整個頁面導致我們需要的功能成為泡影,這樣我們就通過了一個iframe來完成了我們需要的功能。
4. 使用asp.net ajax 來保持Session
Aspx頁面的程式碼如下:
程式碼 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ajax-Refresh.aspx.cs" Inherits="Ajax_Refresh"%><!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></head><body><form id="form1" runat="server"><asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager><div><asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate><asp:Timer ID="Timer1" runat="server" Interval="10000" ontick="Timer1_Tick"></asp:Timer><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></ContentTemplate></asp:UpdatePanel></div></form></body></html>Timer控制元件的Interval可是設定間隔時間但是是毫秒。伺服器端的程式碼我們可以這樣寫:
程式碼 [ C# ]using System;
publicpartialclass Ajax_Refresh : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
// Set session timeout to small value, in this case
// 2 minutes, to see quickly if Timer will keep session alive Session.Timeout =2;
// Set some value in session Session["Testing"] ="session is alive";
}
// Timer will make request to server in regular time intervalsprotectedvoid Timer1_Tick(object sender, EventArgs e)
{
// Write current session value into label Label1.Text = (string)Session["Testing"];
Label1.Text +="<br /> Last request at "+ DateTime.Now.ToString();
}
}
[ VB.NET ]
Partial Class Ajax_Refresh
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Set session timeout to small value, in this case' 2 minutes, to see quickly if Timer will keep session alive Session.Timeout =2' Set some value in session Session("Testing") ="session is alive"
End Sub
' Timer will make request to server in regular time intervals Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
' Write current session value into label Label1.Text = Session("Testing")
Label1.Text &="<br /> Last postback at "& DateTime.Now.ToString()
End Sub
End Class
實際上在許多公司使用asp.netajax的比較少,但是如果是一些要求快速開發的專案來說,asp.net ajax也不愧為一個很好的選擇。
以上就是保持延長Session的四種解決方案,希望對你有些幫助。
筆者測試:筆者直接使用的是第二種方法。目前測試還是很有效的。