Asp.Net 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
|