aps.net session全面介紹(生命週期,逾時時間)

來源:互聯網
上載者:User

標籤:

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:

123456789101112131415161718192021222324252627282930 <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>

 

asp.net幕後處理代碼:

12345678910111213141516171819202122232425 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的到期時間

12 <system.web>   <sessionState timeout="40"></sessionState>  <!---設定session的到期時間,時間以分鐘為單位-->

aps.net session全面介紹(生命週期,逾時時間)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.