1.Session是一種Web會話中的常用狀態之一。
2.Session提供了一種把資訊儲存在伺服器記憶體中的方式。他能儲存任何資料類型,包含自訂對象。
3.每個用戶端的Seesion是隔離儲存區 (Isolated Storage)的。
4.在整個會話過程中,只要SessionID的cookie不丟失,都會儲存Session資訊的。
5.Session不能跨進程訪問,只能由該會話的使用者訪問。應為提取Session資料的id標識是以Cookie的方式儲存到訪問者瀏覽器的緩衝裡的。
6.當會話終止,或到期時,伺服器就清除Session對象。
7.Session常用於儲存登入使用者的ID.
8.Session儲存的資料是跨頁面全域型的。
例如我們想瞭解一下訪問我們網站的使用者瀏覽了幾個頁面,我們可能在使用者可能訪問到每個的頁面中加入:
代碼如下 |
複製代碼 |
<% If Session("PageViewed") = ""Then Session("PageViewed") = 1 Else Session("PageViewed") = Session("PageViewed") + 1 End If %>
|
通過以下這句話可以讓使用者得知自己瀏覽了幾個頁面:
代碼如下 |
複製代碼 |
<% Response.Write("You have viewed " & Session("PageViewed") & " pages") %>
|
Session的使用
代碼如下 |
複製代碼 |
<head runat="server"> <title></title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> function getSessionClick(action) { //這個函數是為了知道哪一個提交按鈕被點擊 $("#hidlgc").val(""); //清空隱藏值 $("#hidlgc").val(action); //給隱藏控制項賦值 } </script> </head> <body> <form id="form1" method="post" action="MySession.aspx"> <table> <tr> <td>帳號:</td><td><input type="text" name="txtUid" /></td>` </tr> <tr> <td>密碼:</td><td><input type="password" name="txtPwd" /></td> </tr> <tr> <td colspan="2"> <input type="hidden" value="" id="hidlgc" name="hidlgclick" /> <input onclick="getSessionClick('lgclick')" type="submit" value="登入" /> <input type="submit" onclick="getSessionClick('getSession')" value="擷取session" /> <input type="submit" onclick="getSessionClick('backLg')" value="退出登入" /> </td> </tr> </table> </form> </body> |
.net代碼
代碼如下 |
複製代碼 |
protected void Page_Load(object sender, EventArgs e) { //把使用者id寫入session中 if (Request.Form["hidlgclick"] == "lgclick") { if(Request.Form["txtUid"].ToString()=="admin"&&Request.Form["txtUid"].ToString()=="admin") //判斷使用者登入 { Session["userName"] = Request.Form["txtUid"].ToString(); //把使用者id儲存到session中 Response.Write(Session["userName"].ToString()+"---點擊登入"); //擷取session,並寫入頁面 } } //擷取Session if (Request.Form["hidlgclick"] == "getSession") { if (Session["userName"] != null) { Response.Write(Session["userName"].ToString() + "---點擊擷取session"); //擷取session,並寫入頁面 } } //取消當前會話,相當於登出(退出登入)。 if (Request.Form["hidlgclick"] == "backLg") { Session.Abandon(); } }
|
那麼我們要怎麼判斷session是否到期了呢
方法一:最笨的方法,在每個頁面的page_load()方法中判斷。
代碼如下 |
複製代碼 |
If(Session[“UserId”]!=null) { //登陸成功的情況 } Else { //response.write(“<script>alter(‘請登陸’);</script>”); } |
這種方法在每個頁面都需要寫入重複的代碼。代碼冗餘
方法二:可以在HttpModule中判斷,在HttpModule中註冊請求管道的AcquireRequestState
事件(可以拿到session的那個事件)
步奏:
1:建立一個繼承IHttpModule介面的類Module
2:讓Module類實現介面成員。
3:在Init()方法中對Context進行註冊AcquireRequestState事件(在這個事件中可以拿到Session)
4:在方法中寫
代碼如下 |
複製代碼 |
void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; if (app.Context.Session["userId"] == null) { app.Response.Write("<script>alert('沒有登入');</script>"); } } |
5:在web.config設定檔中<system.web>節點下添加一個節點
代碼如下 |
複製代碼 |
<httpModules> <add name="demo" type="Module"/> <!--type後面是命名空間.類名--> </httpModules> |
使用這種方法會在每個頁面載入的時候都先檢查module。
原理是實現IHttpModule介面的類是在執行頁面之前執行的。 在page_load()事件執行之前就判 斷Session如果不存在就提示。
這種方法效率能高一些,因為如果不存在 session直接就可以處理。後面的一系列事件都可以不 用執行。
方法三:在page類上做點手腳
Page類中有OnInit()這個虛方法。
步奏:
1:建立一個整合Page類的類TestSession
2:在TestSession中重寫OnInit()這個方法。
3:在OnInit()方法中判斷Session
4:在需要判斷session的頁面整合TestSession這個類,而不是繼承Page類
這種方法比較靈活,在需要判斷session的頁面中繼承TestSession就可以,不需要判斷session 的頁面直接繼承Page就行了
Session的功能的缺陷
目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:
進程依賴性:ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程式。所以當inetinfo.exe進程崩潰時,這些資訊也就丟失。另外,重起或者關閉IIS服務都會造成資訊的丟失。
Session狀態使用範圍的局限性:剛一個使用者從一個網站訪問到另外一個網站時,這些Session資訊並不會隨之遷移過去。例如:新浪網站的WWW伺服器可能不止一個,一個使用者登入之後要去各個頻道瀏覽,但是每個頻道都在不同的伺服器上,如果想在這些WWW伺服器共用Session資訊怎麼辦呢?
Cookie的依賴性:實際上用戶端的Session資訊是儲存與Cookie中的,如果用戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑒於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP.NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP.NET Session成為了一個更加強大的功能。