可能很多人認為,在不重啟瀏覽器的情況下sessionid是不會改變的,其實可以通過代碼來重設sessionid,分享一下~~吼吼:
ASP.NET 工作階段狀態是一種允許您儲存伺服器端、特定於使用者的資料的技術。Web 應用程式可以使用這些資料處理來自為其執行個體化工作階段狀態的使用者的請求。工作階段狀態使用者由會話 ID 標識。通過使用以下方法之一傳送會話 ID:
• |
會話 ID 是發送到使用者瀏覽器的 Cookie 的一部分。 |
• |
會話 ID 嵌入在 URL 中。此技術也稱為“無 Cookie 會話”。 |
會話 ID 是一個由 20 個字元組成的字串表示的 120 位隨機數。字串的格式設定為可以包含在 URL 中並且不必進行 URL 編碼。例如,可以在無 Cookie 會話中使用字串。傳送會話 ID 的最常用方法是通過使用 Cookie 來儲存會話 ID。
當使用者第一次開啟 網頁瀏覽器並轉到某個實現 ASP.NET 工作階段狀態的網站時,將向瀏覽器發送一個名為“ASP.NET_SessionId”並包含由 20 個字元組成的值的 Cookie。
當使用者在相同的 DNS 域中瀏覽時,網頁瀏覽器將繼續向作為源的域發送此 Cookie。
例如,app1.tailspintoys.com 和 app2.tailspintoys.com 都是 ASP.NET 應用程式。如果使用者先後轉到 app1.tailspintoys.com 和 app2.tailspintoys.com,則這兩個應用程式將會使用相同的 Cookie 和相同的會話 ID,以跟蹤使用者在每個應用程式內的工作階段狀態。應用程式之間不會共用相同的工作階段狀態。應用程式之間只共用工作階段 ID。
因此,可以出於多種原因重用會話 ID。例如,如果重用會話 ID,則不必執行下面的操作:
• |
當向您提供有效會話 ID 時,將建立一個新加密的唯一會話 ID。 |
• |
為單個域中的每個 ASP.NET 應用程式建立新的會話 ID。 |
當 Web 應用程式要求登入並提供登出頁或選項時,建議您在使用者登出網站後清除工作階段狀態。若要清除工作階段狀態,請調用“Session.Abandon”方法。使用 “Session.Abandon”方法可以重新整理工作階段狀態,而無需等到工作階段狀態逾時。預設情況下,逾時時間為 20 分鐘的可調到期。每當使用者向網站發出請求並提供會話 ID Cookie 時都會重新整理此到期期限。“Abandon”方法在指示應放棄工作階段狀態的工作階段狀態對象中設定一個標誌。在頁面請求的末尾將檢查該標誌並進行處理。因此,在調 用“Abandon”方法之後,使用者可以在頁面中使用會話對象。一旦完成頁面處理,即會刪除會話。
當使用進程內工作階段狀態模式時,這些工作階段狀態對象將儲存在 HttpCache 中。當滿足下面的條件時,HttpCache 支援回調方法:
• |
刪除了快取項目。 |
• |
工作階段狀態管理器註冊了在刪除快取項目時要調用的“Session_OnEnd”事件處理常式。 |
當工作階段狀態管理器刪除駐留在緩衝中的工作階段狀態對象時,HttpCache 管理器將調用所有登入的回調。實際上,此行為將引發“Session_OnEnd”事件處理常式。
當您放棄會話時,將不會從使用者的瀏覽器中刪除會話 ID Cookie。因此,一旦放棄會話,對同一個應用程式的任何新請求都將使用相同的會話 ID,但具有新的工作階段狀態執行個體。同時,如果使用者在相同的 DNS 域內開啟另一個應用程式,則在從一個應用程式調用“Abandon”方法後,使用者將不會丟失其工作階段狀態。
有時,您可能不希望重用會話 ID。如果是這樣而且您瞭解不重用會話 ID 的後果,請使用下面的程式碼範例以放棄會話並清除會話 ID Cookie:
Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
此程式碼範例從伺服器中清除工作階段狀態,並將工作階段狀態 Cookie 設定為空白值。空值可以有效地從瀏覽器中清除 Cookie。
當使用者沒有從應用程式登出並且發生工作階段狀態逾時時,應用程式可能仍將使用同一個工作階段狀態 Cookie(如果沒有關閉瀏覽器)。 此行為將導致使用者轉到登入頁,並且提供使用者的工作階段狀態 Cookie。 為了保證在開啟登入頁 (login.aspx) 時使用新的 ID,應將空 Cookie 發送回用戶端。為此,將 Cookie 添加到響應集合中。然後,將響應集合發送回用戶端。發送空 Cookie 的最簡單方法是通過使用“Response.Redirect”方法。由於 Cookie 集合對於 ASP.NET_SessionId 始終具有一個值,因此您不能僅僅測試此 Cookie 是否存在,這樣將會建立一個“Response.Redirect”迴圈。可以針對重新導向到登入頁設定查詢字串。
或者,可以使用不同的 Cookie 來通知您是否已經重新導向到登入頁,如下面的程式碼範例所示。為了協助提高安全性,確保沒有任何使用者嘗試通過使用 ASP.NET Cookie 和另一個 Cookie 來開啟登入頁,下面的程式碼範例使用“FormsAuthentication”類來對 Cookie 資料進行加密和解密。然後,程式碼範例設定 5 秒鐘的逾時時間。
private void Page_Load(object sender, System.EventArgs e)
{
if( !IsPostBack &&
( Request.Cookies["__LOGINCOOKIE__"] == null ||
Request.Cookies["__LOGINCOOKIE__"].Value == "" ) )
{
//At this point, we do not know if the session ID that we have is a new
//session ID or if the session ID was passed by the client.
//Update the session ID.
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
//To make sure that the client clears the session ID cookie, respond to
//the client to tell
//it that we have responded. To do this, set another cookie.
AddRedirCookie();
Response.Redirect( Request.Path );
}
//Make sure that someone is not trying to spoof.
try
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt( Request.Cookies["__LOGINCOOKIE__"].Value );
if( ticket == null || ticket.Expired == true )
throw new Exception();
RemoveRedirCookie();
}
catch
{
//If someone is trying to spoof, do it again.
AddRedirCookie();
Response.Redirect( Request.Path );
}
Response.Write("Session.SessionID="+Session.SessionID+"<br/>");
Response.Write("Cookie ASP.NET_SessionId="+Request.Cookies["ASP.NET_SessionId"].Value+"<br/>");
}
private void RemoveRedirCookie()
{
Response.Cookies.Add(new HttpCookie("__LOGINCOOKIE__", ""));
}
private void AddRedirCookie()
{
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(1,"Test",DateTime.Now,DateTime.Now.AddSeconds(5), false,"");
string encryptedText = FormsAuthentication.Encrypt( ticket );
Response.Cookies.Add( new HttpCookie( "__LOGINCOOKIE__", encryptedText ) );
}
注意這句話:Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
Session.Abandon(); 和Session.clear()有什麼區別?Session.Abandon()其實就等於將此次串連斷開,而clear() 是沒有斷開
主要的不同之處在於當使用Session.Abandon時,會調用Session_End方法(InProc模式下)。
當下一個請求到來時將激發Session_Start方法。而Session.Clear只是清除Session中的所有資料並不會中止該Session,因此也不會調用那些方法。
轉自MSDN!