ASP.NET中Session的用法
我們可以使用 Session 物件儲存特定的使用者會話所需的資訊。當用戶在應用程式的頁之間跳轉時,儲存在 Session 物件中的變數不會清除,而使用者在應用程式中訪問頁面時,這些變數始終存在。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個
Session 物件。當會話過期或被放棄後,伺服器將終止該會話。
通過向客戶程式傳送唯一的 Cookie 可以管理伺服器上的 Session 物件。當用戶第一次請求 ASP 應用程式中的某個頁面時,ASP 要檢查 HTTP 頭資訊,檢視是否有在報文中有名為 ASPSESSIONID 的 Cookie 傳送過來,如果有,則伺服器會啟動新的會話,併為該會話生成一個全域性唯一的值,在把這個值作為新
ASPSESSIONID Cookie 的值傳送給客戶端,正是使用這種 Cookie,可以訪問儲存在伺服器上的屬於客戶程式的資訊。Session 物件最常見的作用就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在 Session 物件中。另外其還經常被用在鑑別客戶身份的程式中。要注意的是,會話狀態僅在支援 cookie 的瀏覽器中保留,如果客戶關閉了 Cookie 選項,Session 也就不能發揮作用了。
Session的基本屬性:
一、屬性
1、SessionID
SessionID 屬性返回使用者的會話標識。在建立會話時,伺服器會為每一個會話生成一個單獨的標識。會話標識以長整形資料型別返回。在很多情況下 SessionID 可以用於 WEB 頁面註冊統計。
2、TimeOut
Timeout 屬性以分鐘為單位為該應用程式的 Session 物件指定超時時限。如果使用者在該超時時限之內不重新整理或請求網頁,則該會話將終止。
二、方法
Session 物件僅有一個方法,就是 Abandon,Abandon 方法刪除所有儲存在 Session 物件中的物件並釋放這些物件的源。如果您未明確地呼叫 Abandon 方法,一旦會話超時,伺服器將刪除這些物件。當伺服器處理完當前頁時,下面示例將釋放會話狀態。
< % Session.Abandon %>
三、事件
Session 物件有兩個事件可用於在 Session 物件啟動和釋放是執行過程。
1、Session_OnStart 事件在伺服器建立新會話時發生。伺服器在執行請求的頁之前先處理該指令碼。Session_OnStart 事件是設定會話期變數的最佳時機,因為在訪問任何頁之前都會先設定它們。
儘管在 Session_OnStart 事件包含 Redirect 或 End 方法呼叫的情況下 Session 物件仍會保持,然而伺服器將停止處理 Global.asa 檔案並觸發 Session_OnStart 事件的檔案中的指令碼。
為了確保使用者在開啟某個特定的 Web 頁時始終啟動一個會話,就可以在 Session_OnStart 事件中呼叫 Redirect 方法。當用戶進入應用程式時,伺服器將為使用者建立一個會話並處理 Session_OnStart 事件指令碼。您可以將指令碼包含在該事件中以便檢查使用者開啟的頁是不是啟動頁,如果不是,就指示使用者呼叫 Response.Redirect 方法啟動網頁。程式如下 :
< SCRIPT RUNAT=Server Language=VBScript>
Sub Session_OnStart
startPage = "/MyApp/StartHere.asp"
currentPage = Request.ServerVariables("SCRIPT_NAME")
if strcomp(currentPage,startPage,1) then
Response.Redirect(startPage)
end if
End Sub
< /SCRIPT>
上述程式只能在支援 cookie 的瀏覽器中執行。因為不支援 cookie 的瀏覽器不能返回 SessionID cookie,所以,每當使用者請求 Web 頁時,伺服器都會建立一個新會話。這樣,對於每個請求伺服器都將處理 Session_OnStart 指令碼並將使用者重定向到啟動頁中。
2、Session_OnEnd 事件在會話被放棄或超時發生。
關於使用 Session 物件需要注意的事項 Application 物件相近,請參照前文。
會話可以通過以下三種方式啟動 :
1、一個新使用者請求訪問一個 URL,該 URL 標識了某個應用程式中的 .asp 檔案,並且該應用程式的 Global.asa 檔案包含 Session_OnStart 過程。
2、使用者在 Session 物件中儲存了一個值。
3、使用者請求了一個應用程式的 .asp 檔案,並且該應用程式的Global.asa 檔案使用 < OBJECT> 標籤建立帶有會話作用域的物件的例項。
如果使用者在指定時間內沒有請求或重新整理應用程式中的任何頁,會話將自動結束。這段時間的預設值是 20 分鐘。可以通過在 Internet 服務管理器中設定“應用程式選項”屬性頁中的“會話超時”屬性改變應用程式的預設超時限制設定。應依據您的 Web 應用程式的要求和伺服器的記憶體空間來設定此值。例如,如果您希望瀏覽您的 Web 應用程式的使用者在每一頁僅停留幾分鐘,就應該縮短會話的預設超時值。過長的會話超時值將導致開啟的會話過多而耗盡您的伺服器的記憶體資源。對於一個特定的會話,如果您想設定一個小於預設超時值的超時值,可以設定 Session 物件的 Timeout 屬性。例如,下面這段指令碼將超時值設定為 5 分鐘。
< % Session.Timeout = 5 %>
當然你也可以設定一個大於預設設定的超時值,Session.Timeout 屬性決定超時值。你還可以通過 Session 物件的 Abandon 方法顯式結束一個會話。例如,在表格中提供一個“退出”按鈕,將按鈕的 ACTION 引數設定為包含下列命令的 .asp 檔案的 URL。
< % Session.Abandon %>
Session的用法:
一、使用Session設定許可權
Session簡介:簡單來說就是伺服器給客戶端的一個編號。當一臺WWW伺服器執行時,可能有若干個使用者瀏覽正在運正在這臺伺服器上的網站。當每個使用者首次與這臺WWW伺服器建立連線時,他就與這個伺服器建立了一個Session,同時伺服器會自動為其分配一個SessionID,用以標識這個使用者的唯一身份。這個SessionID是由WWW伺服器隨機產生的一個由24個字元組成的字串。
Session的初次使用:
protected void Page_Load(object sender, EventArgs e)
{//這是頁面的初始化
if (!Page.IsPostBack)
{//判斷是否為初次執行
if (Object.Equals(Session["AdminName"], null))
{//判斷在Session["AdminName"]是否存在值
Response.Redirect("ErrorPage.aspx", true);
}
else
{//要是存在則記錄下這個人的使用者名稱
Name.Text = Session["AdminName"].ToString();
}
}
}
二、進行頁面傳值
在頁面之間傳遞資訊有許多方式:
第一:可以使用QueryString
第二:可以使用Session
第三:Server.Transfer
這三種傳值方式都有利有弊,下面我以我的經驗給大家講解一下
首先:QueryString
QueryString是一種非常簡單的傳值方式,其缺點就是會把要傳遞的值顯示在瀏覽器的位址列中,並且此方法不能夠傳遞物件。如果你想傳遞一個安全性不是那麼重要或者是一個簡單的數值時。使用此方式最好不過。
下面通過一個小例子來說明一下
1.建立一個Web頁面,叫SendMessage.aspx
2.在頁面內新增兩個TextBox,叫TxtName,TxtEmail,與一個Button,叫Submit
protected void Submit_Click(object sender, EventArgs e)
{
String Url = "ReceiveMessage.aspx?Name=" +
TxtName.Text + "&Email=" + TxtEmail.Text;
Response.Redirect(Url);
}
3.再建立一個接收資訊頁面,叫ReceiveMessage.aspx
4.在頁面內新增兩個Label,叫LbName,LbEmail
protected void Page_Load(object sender, EventArgs e)
{//使用Request來接收由上個頁面傳遞過來的值,分別顯示在頁面上
LbName.Text = Request.QueryString["Name"];
LbEmail.Text = Request.QueryString["Email"];
}
再次:使用Session變數
使用Session變數傳值是一種最常見的方式了,此種方式不僅可以把值傳遞到下一個頁面,還可以交叉傳遞到多個頁面,直至把Session變數的值Remove後,才消失
下面舉例說明
1.建立一個頁面,叫SendSession
2.在頁面內新增兩個TextBox,叫TxtName,TxtEmail,新增一個Button,叫Submit
protected void Submit_Click(object sender, EventArgs e)
{//可以使用Session的Add方法
Session["Name"] = TxtName.Text;
//可以使用Session.Add("Name",TxtName.Text);
Session["Email"] = TxtEmail.Text;
//可以使用Session.Add("Email",TxtEmail.Text);
Response.Redirect("ReceiveMessage.aspx");
}
3.再建立一個頁面,叫ReceiveMessage.aspx
4.在頁面內新增兩個Label,叫LbName,LbEmail
protected void Page_Load(object sender, EventArgs e)
{
LbName.Text = Session["Name"].ToString();
LbEmail.Text = Session["Email"].ToString();
Session["Name"].Remove();
Session["Email"].Remove();
//使用結束要清除Session中的值
}
這是使用Session傳遞數值,此方式耗費伺服器的資源,儘量少使用
再次:使用Server.Transfer
這種傳遞方式有點複雜,但也可以是一種值傳遞方式
下面舉例說明一下:
1.建立一個頁面,叫SendMessage.aspx
2.在頁面內新增兩個TextBox,叫TxtName,TxtEmail,新增一個Button,叫Submit
protected void Submit_Click(object sender, EventArgs e)
{
Server.Transfer("ReceiveMessage.aspx");
}
再新增一個屬性
public String Name
{
Get
{
return TxtName.Text;
}
}
public String Email
{
Get
{
return TxtEmail.Text;
}
}
3.再建立一個頁面,叫ReceiveMessage.aspx
4.在頁面放兩個Label,叫LbName,LbEmail
protected void Page_Load(object sender, EventArgs e)
{
//建立原始窗體的例項SendMessage wf1
//獲得例項化的控制代碼
wf1=(SendMessage)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}