ASP編程入門進階(八):內建對象Session

來源:互聯網
上載者:User

ASP對象中除了用於發送(Response)、接收和處理資料(requeest)、伺服器訪問(Server)的對象外,還有一些非常實用的標記Active Server應用程式(Application)和單個使用者資訊(Session)的對象。

Session對象
該對象在ASP使用中占相當大的比例。由於網頁是一種無狀態程式,無法得知使用者瀏覽狀態。在ASP中,通過Session對象來記錄使用者私人的資料變數,以作為使用者再次對伺服器提出要求時做確認,使用者在程式的Web頁面之間跳轉時,存在Session對象中的變數將不會消失。

這些真的是很重要的功能,尤其是有會員的系統必須要用到的。像是會員的登入帳號、時間、狀態以及許許多多該記錄的即時資料(如購物系統記錄使用者的購物籃內的商品),這些資訊屬於各使用者私人所需要,通常開發人員都是使用 Session 記錄處理。

在ASP中的Session是使用Cookies構成,伺服器將所有的Session內記錄的資料,以Cookies的方式傳至使用者的瀏覽器。通常一般瀏覽器會將這些Cookies存起來,每當使用者點選連結,再次與伺服器做聯機時,瀏覽器就會把這些Cookies傳回Server供做處理:這即是Session的運作原理。由此可知工作階段狀態Session僅在支援cookie的瀏覽器中保留,如果客戶關閉了Cookie 選項Session也就不能發揮作用了。

一、Session.SessionID
SessionID 屬性返回使用者的會話標識。在建立會話時,伺服器會為每一個會話產生一個單獨的標識,會話標識以長整形資料類型返回。在很多情況下 SessionID 可以用於 WEB 頁面註冊統計。

利用該屬性可以解決一種對使用者的控制問題。該問題的主要功能就是,針對某個網站的一個模組,當一個會員登入後正在看此模組時,另一個人用同樣的會員名登入,就不能瀏覽這個模組:也就是說一個會員名同時只能一個人瀏覽此模組。

通過用會員名(假設為UserID,唯一)和SessionID來實現了控制。當會員登入時,給這個會員一個Session記錄登入狀態如:Session("Status")="Logged",同時把這個會員的Session.SessionID寫入資料庫。當他要瀏覽此模組時,先判斷其是否登入,若已經登入再判斷它的SessionID是否與資料庫記錄的相同,如果不同則不能訪問。

這樣,當另一個使用者用相同的會員名登入時,那麼資料庫中記錄的就是新的SessionID,前者訪問此模組時就不能通過檢查。這就實現了一個會員名同時只能一個人瀏覽某個模組。這個功能在一些收費網站有很有特別作用,它防止了一個會員名給多個人瀏覽的問題,為公司保障了利益。

<%=Session.SessionId%>
是單獨產生的唯一ID標識,可重新整理調試。

二、Session.TimeOut
該屬性設定的Session的最大間隔時間。間隔時間是指客戶器端從最近一次向Web伺服器提出要求,到下一次向Web伺服器提出要求的時間。可以理解為:如果使用者在該逾時時限之內不重新整理或請求網頁,則該會話將終止。Timeout 屬性是以分鐘為單位,為該應用程式的Session對象指定逾時時限的,一般預設為20分鐘。這在網吧等公用場所,登入個人資訊頁而忘記關閉視窗時,顯得比較重要(至少可以把時間設短些)。

<%Session.TimeOut=10%>

以上SessionId、TimeOut屬於Session對象的兩個屬性,下面看該對象的一個方法Abandon

三、Session.Abandon
該方法是Session對象的唯一方法,可以清除Session對象,用來消除使用者的Session對象並釋放其所佔的資源。當然你如果沒有明確調用Abandon方法,一旦會話逾時,伺服器也會將刪除這些對象並釋放資源。
下面就用兩個頁的程式來認識Session對象以及Abandon方法的利用。

1,login.asp

<%
'是提取url中變數loginout的值是否為true,若為真,就執行Session.Abandon()。
if Request.QueryString("loginout")="true" then
Session.Abandon()
end if

'只有在當點擊了submit按鈕的前提下,再來判斷提取的東西都不為空白,則建立Session對象。
submitname=request.form("submit1")
if submitname="submit" then
if Request.Form("name")<>"" and Request.Form("pwd")<>"" then
Session("name")=Request.Form("name")
Session("pw")=Request.Form("pwd")
end if
end if
%>
<%
'如果Session("name")不為空白,則顯示Session("name")的值,並且做一個到info.asp的連結。
if Session("name")<>"" then
response.write("你的name值是:"&Session("name"))
response.write("<br><a href='info.asp'>顯示你的資料</a>")
else

'否則,即Session("name")為空白不存在,則顯示表單用以輸入建立Session的平台。
%>
<form action="login.asp" method="post">
姓名:<input type="text" name="name"><br>
密碼:<input type="password" name="pwd"><br>
<input type="submit" value="submit" name="submit1">
</form>
<!--同樣做了一個到info.asp的連結。-->
<a href="info.asp">顯示你的資料</a>
<%end if%>

注意Session("name")為空白和不為空白的時候,都做了一個到info.asp的連結,具體調試結果如何,再來看info.asp的內容。

2,info.asp

<%
'如果session對象值為空白則跳轉到login.asp
if session("name")="" then
Response.Redirect("login.asp")
'否則就顯示個人資訊
else
Response.Write("你的姓名:"&session("name")&"<br>")
Response.Write("你的密碼:"&session("pw")&"<br>")
end if
%>
<a href="login.asp">返回</a>
<a href="login.asp?loginout=true">退出</a>

可以看出來,info.asp頁面內容的顯示其實是需要條件的。那就是必須得有一個session值的存在,這樣才可以顯示具體的資訊。這在登入系統中運用得比較多。

你可以把login.asp想象成一個登入視窗,當然我的這個比較簡單(只要輸入用名和密碼就生產Session了),實際情況是:判斷輸入的用名和密碼是否和資料庫中的用名和密碼吻合,如果正確吻合才產生Session的。然info.asp頁面的作用剛好可以做為一許可權頁面,因為進入該頁需要Session,而Session的產生是確保用名密碼正確的。

所以當一開始出現表單視窗時,你點login.asp連結是打不開的,只有當提交了表單產生了Session後才能進入。這正是登入系統的精髓所在,Do You Know?:)

四、Session_OnStart
Session_OnStart屬於Session對象的一類事件。它是在伺服器建立新會話時發生的。伺服器在執行請求的頁之前先處理該指令碼。Session_OnStart 事件是設定會話期變數的最佳時機,因為在訪問任何頁之前都會先設定它們。

對象的常式每一次啟動時觸發Session_OnStart事件,然後運行Session_Onstart事件的處理過程。也就是說,當伺服器接收到應用程式中的URL的HTTP請求時,觸發此事件,並建立一個Session對象。

當然說到Session_OnStart事件就不能不談到一個檔案Global.asa(P.S:我打算把該檔案和Chat程式放在一起說的,所以現在先不作過多解釋)
具體用法先透露,寫在Global.asa檔案內部

<SCRIPT RUNAT=Server Language=VBScript>
.......
Sub Session_OnStart
.......
End Sub
.......
</SCRIPT>

五、Session_OnEnd
一看也就知道是Session對象的另一類事件了。當調用Session.Abandon方法時或者在TimeOut的時間內沒有重新整理,這會觸發Session_OnEnd事件,然後執行裡面的指令碼。同樣具體用法在後面將寫的Global.asa檔案專題中詳細介紹到,簡單文法如下:

<SCRIPT RUNAT=Server Language=VBScript>
.......
Sub Session_OnEnd
.......
End Sub
.......
</SCRIPT>

最後,不知道大家有沒有玩過這樣的一個程式:很令人討厭的,讓你永遠關不掉的程式頁面。
只做程式調試,不要去作弄別人。

以下檔案儲存為bug.html

<body onunload=javascript:window.open("bug.html")><br />
[Ctrl+A 全部選擇進行拷貝 提示:可先修改部分代碼,再點擊運行]

發現該檔案關不了了?(當然你要關閉,把原始碼修改下)
那現在的要求是:計算關閉的次數,如果超過多少次就可以自行關閉,那下面就採用到session

以下檔案儲存為bug.asp

<%if session("num") < 2 then%>
<body onunload=javascript:window.open("bug.asp")>
<%session("num")=session("num")+1%>
<%else%>
<script>
self.close()
</script>
<%end if%>

呵呵,當你關閉三次以後,視窗就再也不彈出了。瞭解吧:)
以上就是對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.