詳解ASP.NET中Session的用法

字號:


    當(dāng)用戶在應(yīng)用程序的頁之間跳轉(zhuǎn)時,存儲在 Session 對象中的變量不會清除,而用戶在應(yīng)用程序中訪問頁面時,這些變量始終存在。當(dāng)用戶請求來自應(yīng)用程序的 Web 頁時,如果該用戶還沒有會話,則 Web 服務(wù)器將自動創(chuàng)建一個 Session 對象。當(dāng)會話過期或被放棄后,服務(wù)器將終止該會話。
    通過向客戶程序發(fā)送唯一的 Cookie 可以管理服務(wù)器上的 Session 對象。當(dāng)用戶第一次請求 ASP 應(yīng)用程序中的某個頁面時,ASP 要檢查 HTTP 頭信息,查看是否有在報文中有名為 ASPSESSIONID 的 Cookie 發(fā)送過來,如果有,則服務(wù)器會啟動新的會話,并為該會話生成一個全局唯一的值,在把這個值作為新 ASPSESSIONID Cookie 的值發(fā)送給客戶端,正是使用這種 Cookie,可以訪問存儲在服務(wù)器上的屬于客戶程序的信息。Session 對象最常見的作用就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。另外其還經(jīng)常被用在鑒別客戶身份的程序中。要注意的是,會話狀態(tài)僅在支持 cookie 的瀏覽器中保留,如果客戶關(guān)閉了 Cookie 選項,Session 也就不能發(fā)揮作用了。
    (一)Session的基本屬性:
    一、屬性
    1、SessionID
    SessionID 屬性返回用戶的會話標(biāo)識。在創(chuàng)建會話時,服務(wù)器會為每一個會話生成一個單獨的標(biāo)識。會話標(biāo)識以長整形數(shù)據(jù)類型返回。在很多情況下 SessionID 可以用于 WEB 頁面注冊統(tǒng)計。
    2、TimeOut
    Timeout 屬性以分鐘為單位為該應(yīng)用程序的 Session 對象指定超時時限。如果用戶在該超時時限之內(nèi)不刷新或請求網(wǎng)頁,則該會話將終止。
    二、方法
    Session 對象僅有一個方法,就是 Abandon,Abandon 方法刪除所有存儲在 Session 對象中的對象并釋放這些對象的源。如果您未明確地調(diào)用 Abandon 方法,一旦會話超時,服務(wù)器將刪除這些對象。當(dāng)服務(wù)器處理完當(dāng)前頁時,下面示例將釋放會話狀態(tài)。
    < % Session.Abandon %>
    三、事件
    Session 對象有兩個事件可用于在 Session 對象啟動和釋放是運行過程。
    1、Session_OnStart 事件在服務(wù)器創(chuàng)建新會話時發(fā)生。服務(wù)器在執(zhí)行請求的頁之前先處理該腳本。Session_OnStart 事件是設(shè)置會話期變量的最佳時機(jī),因為在訪問任何頁之前都會先設(shè)置它們。
    盡管在 Session_OnStart 事件包含 Redirect 或 End 方法調(diào)用的情況下 Session 對象仍會保持,然而服務(wù)器將停止處理 Global.asa 文件并觸發(fā) Session_OnStart 事件的文件中的腳本。
    為了確保用戶在打開某個特定的 Web 頁時始終啟動一個會話,就可以在 Session_OnStart 事件中調(diào)用 Redirect 方法。當(dāng)用戶進(jìn)入應(yīng)用程序時,服務(wù)器將為用戶創(chuàng)建一個會話并處理 Session_OnStart 事件腳本。您可以將腳本包含在該事件中以便檢查用戶打開的頁是不是啟動頁,如果不是,就指示用戶調(diào)用 Response.Redirect 方法啟動網(wǎng)頁。程序如下 :
    < 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,所以,每當(dāng)用戶請求 Web 頁時,服務(wù)器都會創(chuàng)建一個新會話。這樣,對于每個請求服務(wù)器都將處理 Session_OnStart 腳本并將用戶重定向到啟動頁中。
    2、Session_OnEnd 事件在會話被放棄或超時發(fā)生。
    關(guān)于使用 Session 對象需要注意的事項 Application 對象相近,請參照前文。
    會話可以通過以下三種方式啟動 :
    1)、一個新用戶請求訪問一個 URL,該 URL 標(biāo)識了某個應(yīng)用程序中的 .asp 文件,并且該應(yīng)用程序的 Global.asa 文件包含 Session_OnStart 過程。
    2)、用戶在 Session 對象中存儲了一個值。
    3)、用戶請求了一個應(yīng)用程序的 .asp 文件,并且該應(yīng)用程序的Global.asa 文件使用 < OBJECT> 標(biāo)簽創(chuàng)建帶有會話作用域的對象的實例。
    如果用戶在指定時間內(nèi)沒有請求或刷新應(yīng)用程序中的任何頁,會話將自動結(jié)束。這段時間的默認(rèn)值是 20 分鐘??梢酝ㄟ^在 Internet 服務(wù)管理器中設(shè)置“應(yīng)用程序選項”屬性頁中的“會話超時”屬性改變應(yīng)用程序的默認(rèn)超時限制設(shè)置。應(yīng)依據(jù)您的 Web 應(yīng)用程序的要求和服務(wù)器的內(nèi)存空間來設(shè)置此值。例如,如果您希望瀏覽您的 Web 應(yīng)用程序的用戶在每一頁僅停留幾分鐘,就應(yīng)該縮短會話的默認(rèn)超時值。過長的會話超時值將導(dǎo)致打開的會話過多而耗盡您的服務(wù)器的內(nèi)存資源。對于一個特定的會話,如果您想設(shè)置一個小于默認(rèn)超時值的超時值,可以設(shè)置 Session 對象的 Timeout 屬性。例如,下面這段腳本將超時值設(shè)置為 5 分鐘。
    < % Session.Timeout = 5 %>
    當(dāng)然你也可以設(shè)置一個大于默認(rèn)設(shè)置的超時值,Session.Timeout 屬性決定超時值。你還可以通過 Session 對象的 Abandon 方法顯式結(jié)束一個會話。例如,在表格中提供一個“退出”按鈕,將按鈕的 ACTION 參數(shù)設(shè)置為包含下列命令的 .asp 文件的 URL。
    < % Session.Abandon %>
    (二)Session的用法:
    一、使用Session設(shè)定權(quán)限
    Session簡介:
    簡單來說就是服務(wù)器給客戶端的一個編號。當(dāng)一臺WWW服務(wù)器運行時,可能有若干個用戶瀏覽正在運正在這臺服務(wù)器上的網(wǎng)站。當(dāng)每個用戶首次與這臺WWW服務(wù)器建立連接時,他就與這個服務(wù)器建立了一個Session,同時服務(wù)器會自動為其分配一個SessionID,用以標(biāo)識這個用戶的唯一身份。這個SessionID是由WWW服務(wù)器隨機(jī)產(chǎn)生的一個由24個字符組成的字符串。
    -Session的初次使用:
    protected void Page_Load(object sender, EventArgs e)
    {//這是頁面的初始化
      if (!Page.IsPostBack)
      {//判斷是否為初次執(zhí)行
       if (Object.Equals(Session["AdminName"], null))
       {//判斷在Session["AdminName"]是否存在值
        Response.Redirect("ErrorPage.aspx", true);
       }
       else
       {//要是存在則記錄下這個人的用戶名
       Name.Text = Session["AdminName"].ToString();
       }
      }
    }
    二、進(jìn)行頁面?zhèn)髦?BR>    在頁面之間傳遞信息有許多方式:
    第一:可以使用QueryString
    第二:可以使用Session
    第三:Server.Transfer
    這三種傳值方式都有利有弊,下面我以我的經(jīng)驗給大家講解一下
    首先:QueryString
    QueryString是一種非常簡單的傳值方式,其缺點就是會把要傳遞的值顯示在瀏覽器的地址欄中,并且此方法不能夠傳遞對象。如果你想傳遞一個安全性不是那么重要或者是一個簡單的數(shù)值時。使用此方式最好不過。
    下面通過一個小例子來說明一下
    1.創(chuàng)建一個Web頁面,叫SendMessage.aspx
    2.在頁面內(nèi)添加兩個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.再創(chuàng)建一個接收信息頁面,叫ReceiveMessage.aspx
    4.在頁面內(nèi)添加兩個Label,叫LbName,LbEmail
    protected void Page_Load(object sender, EventArgs e)
    {//使用Request來接收由上個頁面?zhèn)鬟f過來的值,分別顯示在頁面上
     LbName.Text = Request.QueryString["Name"];
     LbEmail.Text = Request.QueryString["Email"];
    }
    -再次:使用Session變量
    使用Session變量傳值是一種最常見的方式了,此種方式不僅可以把值傳遞到下一個頁面,還可以交叉?zhèn)鬟f到多個頁面,直至把Session變量的值Remove后,才消失
    下面舉例說明
    1.創(chuàng)建一個頁面,叫SendSession
    2.在頁面內(nèi)添加兩個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.再創(chuàng)建一個頁面,叫ReceiveMessage.aspx
    4.在頁面內(nèi)添加兩個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();
     //使用結(jié)束要清除Session中的值
    }
    這是使用Session傳遞數(shù)值,此方式耗費服務(wù)器的資源,盡量少使用
    -再次:使用Server.Transfer
    這種傳遞方式有點復(fù)雜,但也可以是一種值傳遞方式
    下面舉例說明一下:
    1.創(chuàng)建一個頁面,叫SendMessage.aspx
    2.在頁面內(nèi)添加兩個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.再創(chuàng)建一個頁面,叫ReceiveMessage.aspx
    4.在頁面放兩個Label,叫LbName,LbEmail
    protected void Page_Load(object sender, EventArgs e)
    {
     //創(chuàng)建原始窗體的實例SendMessage wf1
     //獲得實例化的句柄
     wf1=(SendMessage)Context.Handler;
     Label1.Text=wf1.Name;
     Label2.Text=wf1.EMail;
    }
    以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)理解ASP.NET中Session的用法有所幫助。