1. 程式人生 > >Asp.Net Session生命週期

Asp.Net Session生命週期

Asp.Net中的Session與Cookie最大的區別在於:Cookie資訊全部存放於客戶端,Session則只是將一個ID存放在客戶端做為與服務端驗證的標記,而真正的資料都是放在服務端的記憶體之中的。  在傳統web程式語言(比如asp)中,session的...

 

  Asp.Net中的Session與Cookie最大的區別在於:Cookie資訊全部存放於客戶端,Session則只是將一個ID存放在客戶端做為與服務端驗證的標記,而真正的資料都是放在服務端的記憶體之中的。

  在傳統web程式語言(比如asp)中,session的過期完全是按照TimeOut來老老實實處理的,超時值預設是20分鐘,但問題是:通常有很多使用者只看一眼網頁,然後就關瀏覽器走人了,這種情況下,服務端記憶體裡還長久儲存著Session的資料,如果這種使用者很多,對伺服器資源無疑是一種浪費。預設情況下,系統採用的是InProc模式,即程序內模式。這種情況下,Session是儲存在Asp.Net工作程序對映的記憶體中的,問題是Asp.Net工作程序為了維護良好的平均效能,會被系統經常回收。我們在IIS裡可以配置自動回收(比如按時間週期回收,或者當記憶體使用達到多少值時自動回收)。 當Asp.Net工作程序被回收時,其對映的記憶體全部被清空並初始化,以便其它程式可以使用,所以Session也跟著一併消失了,就這是為什麼Sesssion會無故消失的主要原因。

一、session是怎麼儲存,提取的?

1.在伺服器端有一個session池,用來儲存每個使用者提交session中的資料,Session對於每一個客戶端(或者說瀏覽器例項)是“人手一份”,使用者首次與Web伺服器建立連線的時候,伺服器會給使用者分發一個SessionID作為標識。SessionID是一個由24個字元組成的隨機字串。使用者每次提交頁面,瀏覽器都會把這個SessionID包含在HTTP頭中提交給Web伺服器,這樣Web伺服器就能區分當前請求頁面的是哪一個客戶端,而這個SessionID是一cookie的方式儲存的在客戶端的記憶體中的,如果想要得到Session池中的資料,伺服器就會根據客戶端提交的唯一SessionID標識給出相應的資料返回。

2.輸入正確的賬號密碼,點選登入,頁面就會輸出  “admin --- 點選登入”

二、Session池中每個客戶端的資料是怎麼儲存的?

1.儲存在Session池中的資料是全域性型的資料,可以跨頁面訪問,每個SessionID中只儲存唯一的資料,如:首先你這樣設定:session["userName"]="admin",然後你在會話還沒結束的session還沒過期的情況下,你又設定:session["userName"]="123";這樣這個SessionID沒變,然而Session池中的資料則被覆蓋。此時session["userName"]的值就是“123”,而不是其它。

2.Session池中的資料不能跨程序訪問。如:開啟login.aspx頁面寫入session[“userName”]="admin";然後login頁面不關閉,即此會話不結束,在這是你再在另外一個瀏覽器中開啟一個login.aspx頁面則session["userName"]=null

3.輸入賬號密碼,點選登入頁面輸出  “admin --- 點選登入” ,如果緊接著點選獲取session按鈕,則頁面只輸出"admin--- 點選獲取session",如果頁面不關閉,開啟另外一個瀏覽器,點選獲取session按鈕,則頁面沒法應。

三丶session的宣告週期與銷燬

1.session儲存資料計時是滾動計時方式。具體是這樣的,如果你開啟寫入session,從寫入開始,此頁面如果一直沒有提交操作,則預設時間是20分鐘,20分鐘後session被伺服器自動銷燬,如過有提交操作,伺服器會從提交後重新計時以此類推,直至設定時間內銷燬。

2.可以設定session的銷燬時間。上面程式碼有提到。

四丶session中儲存的資料是在服務端的,而每個使用者如進行登入操作,都要進行session資料寫入,所以建議慎用session,就是少用。

五丶程式碼舉例:

html:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 < 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

相關推薦

Asp.Net Session生命週期

Asp.Net中的Session與Cookie最大的區別在於:Cookie資訊全部存放於客戶端,Session則只是將一個ID存放在客戶端做為與服務端驗證的標記,而真正的資料都是放在服務端的記憶體之中的。  在傳統web程式語言(比如asp)中,session的... &nb

ASP.NET C# 生命週期 « 關於網路那些事...

ASP.NET 生命週期 ASP.NET 可以動態的生成頁面,而運作的架構生命週期主要可以分為: 應用程式生命週期(Application Life Cycle)

ASP.NET頁面生命週期 (轉載)

#  事件或方法  功能  描述   1  Init 事件  頁面初始化  頁面生存週期中的第一個階段是初始化。當 Init 事件發生時,在 .aspx 原始檔中靜態宣告的所有控制元件都已例項化並取其預設值。應該注意的是,這時檢視狀態資訊還不可用。   2  LoadVie

ASP.NET頁面生命周期與控件生命周期

回發 數據 數據處理 數據庫 dispose 足夠 -- 實現邏輯 save ASP.NET頁面生命周期 (1)PreInit 預初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 預加載(5)Load 加載(6)LoadComple

大型Web 站點 Asp.net Session過期你怎麽辦

站點 ria send rac 請求 問題 btn b2c title 在 WEB 系統中。 我們通常會用session來保存一些簡單可是卻非常重要的信息。比方Asp.net中常常會用Session來保存用戶登錄信息,比方UserID。為了解決 WEB場大家採用了把s

ASP.NET Session

.aspx 狀態 spa 第一個 get 主頁 .net 刷新 打不開 Session 保存在服務器上 缺點;占用服務器資源 優點:安全 不會存持續性的,大量的東西只有會話模式 20分鐘生命周期 當瀏覽器關閉時,Session不在了,關閉了,打不開了網頁 web端

如何確定asp.net請求生命周期的當前處理事件

authorize nbsp not text state uri public error security 1 首先在全局應用程序裏面添加如下代碼 using System; using System.Collections.Generic; using System

ASP.NET頁面生命周期

重寫 此外 基於 但是 程序代碼 lib 實例化 html soft 文章:重寫page的OnInit(學習中總結的) 百度:ASP.NET 頁生命周期概述 地址:https://msdn.microsoft.com/zh-cn/library/ms178472(v=v

ASP.NET生命周期概述

默認 顯式 支持 event 註意事項 和數 databind dex unique 來自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=107 ASP.NET 頁運行時,此頁將經歷一個生命周期,在生命周期中將執行一系列

一個隊asp.net session進行了再次封裝的C#類的程式碼

將寫內容過程經常用到的內容片段做個收藏,下邊內容段是關於一個隊asp.net session進行了再次封裝的C#類的內容。 using System.Web; namespace DotNet.Utilities { public static class SessionHelper2

一個隊asp.net session進行了再次封裝的C#類的代碼

out time oid 再次 current web mes get pub 將寫內容過程經常用到的內容片段做個收藏,下邊內容段是關於一個隊asp.net session進行了再次封裝的C#類的內容。 using System.Web; namespace DotNe

關於Session生命週期和使用HttpSessionListener中遇到的問題

    繼續重複昨天的內容,昨天提到 Session 其建立並不是當我們客戶端訪問伺服器時就產生的,而是我們在如Servlet類中有類似HttpServletRequest.getSession()時才會建立。而其結束時間更不是我們關閉客戶端時產生。注:我們關閉客戶端只是使客

asp.net session超時的解決辦法

第一個辦法: 我有好辦法。並且一直用,感覺很爽。1、在web.config裡面加入:<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless ="f

ASP.NET Session丟失問題解決方案總結及判斷Session是否過期【轉載】

判斷Session是否過期: 通過BasrPage或IHtttpMoudle實現public class BasePage : System.Web.UI.Page    {      public  BasePage()      {       }       prot

ElastiCache as an ASP.NET Session Store

Are you hosting an ASP.NET application on AWS? Do you want the benefits of Elastic Load Balancing (ELB) and Auto Scaling, but feel limited by a d

7.SessionManager(session生命週期管理)

SessionManager負責管理shiro自己封裝的session的生命週期。 為什麼shiro要自己封裝session? 1.可以為任意應用提供session支援,不依賴於底層容器 2.簡單擴容session管理容器,可以實現任何資料來源(redis

Hibernate學習--Session生命週期的不同狀態

前言 總結一下Session的不同狀態。 Session的生命週期不同狀態 三種狀態 Hibernate生命週期中java物件的三種狀態: 1、臨時狀態(transient):用ne

.net頁面生命週期

       ASP.NET 頁執行時,此頁將經歷一個生命週期,在生命週期中將執行一系列處理步驟。這些步驟包括初始化、例項化控制元件、還原和維護狀態、執行事件處理程式程式碼以及進行呈現。瞭解頁的生命週期非常重要,這樣就能在合適的生命週期階段編寫程式碼,以達到預期效果。此外,如

JSP之Session生命週期

我要介紹一下Session的生命週期,當網頁中客戶第一次訪問Web應用中支援session的某個網頁時,就會建立一個新的session。結下來當客戶瀏覽這個Web應用的不同網頁時,始終處於一個se

談談.net物件生命週期

 不用程式設計師操心的堆 — 託管堆           程式在計算機上跑著,就難免會佔用記憶體資源來儲存在程式執行過程中的資料,我們按照記憶體資源的存取方式將記憶體劃分為堆記憶體和棧記憶體。     棧記憶體,通常使用