程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> cookies和session的關系

cookies和session的關系

編輯:ASP技巧
1。 CookIE是一種發送到客戶浏覽器的文本串句柄,並保存在客戶機硬盤上, 

可以用來在某個Web站點會話之間持久地保持數據。Request和Response對象都有 

一組Cookie。Request.cookie集合是一系列CookIE,從客戶端與HTTP Request一 

起發送到Web服務器。反過來,如果你希望把CookIE發送到客戶機,就可以使用R 

esponse.cookIE 
1、ExpiresAbsolute屬性 
  該屬性可以賦一個日期,過了這個日期CookIE就不能再被使用了。通過給Ex 

pires屬性賦一個過期的日期,就可以刪除CookIE。如: 
<%Response.cookIEs("passtime").expiresAbsolute="1/1/99"%> 
2、Domain屬性 
  該屬性定義Cookie要傳送的唯一域。如:CookIE只傳送給Microsoft的人, 

則可以使用以下代碼。 
<%Response.CookIEs("domain").Domain="www.microsoft.com"%> 
3、ASP用來寫入Cookie即向客戶機發送CookIE的語法如下:   
  Response.Cookie("CookIE名").[("鍵名").屬性]=內容 
  如果某個ASP文件要創建一個CookIE,則下面的代碼可以放在ASP文件的第一 

個<Html>之前,以避免產生錯誤. 
<%Response.Cookies("CookieName")="NewCookIE" %> 
<Html> 
...... 
</Html> 
4、同樣ASP用Request對象的Cookies集合來讀取CookIE,如: 
<%Response.write Request.Cookies("CookIEName")%> 
  下面以一個完整的例子來說明CookIE: 
<% 
dim Num 
Num=Request.CookIEs("Visit_num") 
if Num>0 then 
Num=Num+1 
Response.write "您已是第" &#38; Num &#38; "次訪問本站點了。" 
else 
Response.write "歡迎您首次訪問本站。" 
Num=1 
end if 
Response.CookIEs("Visit_num")=Num 
%> 
  在該例子中,首先讀取CookIEs變量Visit_num,看用戶端計算機是否保存有 

CookIEs變量。如果有該變量,則說明用戶已經訪問過該頁面,同時輸入出訪問 

次數。如果用戶是首次訪問該頁面,則其計算機內不會有CookIEs變量,程序會 

顯示“歡迎”字樣,然後將CookIEs變量Visit_num存到用戶計算機中,以便該用 

戶下一次訪問該頁面時給出“訪問的次數”信息。 
5、CookIE字典 
  有時在一個頁面中可能需要定義很多個CookIEs變量,為了更好地管理它, 

在CookIEs組件中常引入一人的概念“子鍵”。引用它的語法如下: 
  Request.CookIEs("變更名")("子鍵名")   
  如下面的CookIE創建一個名為"Dictionary"的字典,其中保存了三個鍵值: 
<% 
Response.CookIE("info")("Myname")="jeff" 
Response.CookIE("info")("Gender")="male" 
Response.CookIE("info")("Myheight")="172" 
%> 
  事實上客戶機上的CookIE字典是以字符串的形式存在: 
info=Myname=jeff&#38;Gender=male&#38;Myheight=172 
  如果用戶沒有指定“子鍵”名而直接引用CookIEs變量,將會返回一個包含 

所有的“子鍵”名及值的字符串。例如上面這個例子包含三個“子鍵”:"Mynam 

e"、"Gender"和"Myheight",當用戶沒有指定其“子鍵”而直接通過Request.Co 

okIEs("info")來引用時,則會得到下列字符串: 
info=Myname=jeff&#38;Gender=male&#38;Myheight=172 
  如果要把CookIE中讀取的所有數據,可以用下面的代碼得到: 
<%For each cookie in Request.CookIEs 
if Not cookIE.HasKeys then 
Response.write cookie &#38; "=" &#38; Request.Cookies(cookIE) 
Else 
for each key in Request.Cookies(cookIE) 
Response.write cookIE&#38;"("&#38;key&#38;")"&#38;"="&#38; 

Request.Cookies(cookIE)(key) 
next 
end if 
next 
%> 


2。Session其實指的就是訪問者從到達某個特定主頁到離開為止的那段時間。每 

一訪問者都會單獨獲得一個Session。在Web應用程序中,當一個用戶訪問該應用 

時,Session類型的變量可以供這個用戶在該Web應用的所有頁面中共享數據;如 

果另一個用戶也同時訪問該Web應用,他也擁有自己的Session變量,但兩個用戶 

之間無法通過Session變量共享信息,而Application類型的變更則可以實現站點 

多個用戶之間在所有頁面中共享信息。 



1、SessionID屬性 
  該屬性返回當前會話的唯一標志,為每一個Session分配不同的編號。 
  我曾在開發過程中就遇到對用戶的控制問題。它要實現的功能就是,針對某 

個網站的一個模塊,當一個會員登錄後正在看此模塊時,另一個人用同樣的會員 

名登錄,就不能浏覽這個模塊。也就是說一個會員名同時只能一個人浏覽此模塊 

。我通過用會員名(假設為UserID,唯一)和SessionID來實現了控制。當會員 

登錄時,給這個會員一個Session記錄登錄狀態如:Session("Status")="Logged 

",同時把這個會員的Session.SessionID寫入數據庫。當他要浏覽此模塊時,先 

判斷其是否登錄,若已經登錄再判斷它的SessionID是否與數據庫記錄的相同, 

如果不同則不能訪問。這樣,當另一個用戶用相同的會員名登錄時,那麼數據庫 

中記錄的就是新的SessionID,前者訪問此模塊時就不能通過檢查。這就實現了 

一個會員名同時只能一個人浏覽某個模塊。這個功能在一些收費網站有很有特別 

作用,它防止了一個會員名給多個人浏覽的問題,為公司保障了利益。 

2、TimeOut屬性 
  該屬性用來定義用戶Session對象的時限。如果用戶在規定的時間內沒有刷 

新網頁,則Session對象就會終止。一般默認為20分鐘。   



3、Abandon方法 
  該方法是Session對象的唯一方法,可以清除Session對象,用來消除用戶的 

Session對象並釋放其所占的資源。如: <% Session.Abandon %> 
4、Session_OnStart和Session_OnEnd事件 
  和Application一樣,當對象的例程每一次啟動時觸發Session_OnStart事件 

,然後運行Session_Onstart事件的處理過程。也就是說,當服務器接收到應用 

程序中的URL的HTTP請求時,觸發此事件,並建立一個Session對象。同理,這個 

事件也必須定在Global.asa文件中。 
  當調用Session.Abandon方法時或者在TimeOut的時間內沒有刷新,這會觸發 

Session_OnEnd事件,然後執行裡面的腳本。Session變量與特定的用戶相聯系, 

針對某一個用戶賦值的Session變量是和其他用戶的Session變量完全獨立的,不 

會存在相互影響。 
Session應用一列: 
  與Application一樣,一個被定義為Session類型的數組只能將整個數組作為 

一個對象,用戶不能直接改變Session數組中某個元素的值。為了創建一個Sessi 

on數組,需先定義一個普通的數組,並對它的每一個元素賦初值,最後把它定義 

為一個Session數組。如: 
<% 
dim array() 
array=array("jeff","zhu","male") 
Session("info")=array 
Response.write Session("info")(0) &#38;"-" 
Response.write Session("info")(1) &#38;"-" 
Response.write Session("info")(2) &#38;"<br>" 
%> 
<hr> 
<% 
array(0)="jun" 
array(1)="li" 
array(2)="female" 
Session("info")=array 
Response.write Session("info")(0) &#38; "-" 
Response.write Session("info")(1) &#38; "-" 
Response.write Session("info")(2) &#38; "<br>" 
%> 
  以上這段程序輸出結果是: 
jeff-zhu-male 
_____________ 
jun-li-female 


Session是怎樣工作的? 

Session其實是利用Cookie進行信息處理的,(參見後面有關CookIEs的介紹), 

當用戶首先進行了請求後,服務端就在用戶浏覽器上創建了一個CookIE,當這個 

Session結束時,其實就是意味著這個CookIE就過期了。 
為這個用戶創建的CookIE的名稱是ASPSESSIONID。這個CookIE的唯一目的就是為 

每一個用戶提供不同的身份認證。 
注:如果你對名字是ASPSESSIONID的COOKIE感到好奇,你可以利用ServerVariab 

les集合的COOKIE Header來接受這個信息,參看下面這個腳本: 
<%=Request.ServerVariables(“HTTP COOKIE”) %> 
你可以刷新不止一次而顯示結果依然不變。如果希望對ServerVariables集合有 

更多了解,那麼請去看第14章。 
Session變量自己不會存在用戶浏覽器上。不過,ASPSESSIONID這個cookIE需要 

使用session變量。server使用ASPSESSIONID 

cookie來將特定的用戶和特定的session信息聯系起來。沒有cookIE的話,Serve 

r就不會了解到每一個特定用戶在網站中移動的信息。 
利用SessionID變量存儲ASPSESSIONID 

cookIE和直接對名為ASPSESSIONID的cookIE賦值有很大不同。微軟利用了一個復 

雜的數學算法對SessionID進行了加密措施,以防止黑客猜測出SessionID的值並 

且依據這個獲得不該獲得的身份或權限。 
注:你可以用兩種方法屏蔽掉SessionID,一種是將全站進行屏蔽,另外一種是 

將一個單獨Active Server Page進行相應屏蔽。 
如果想要將整個站點的Session操作進行屏蔽,你可以使用Internet Service 

Manager。從Application設置對話框,點擊Active Server 

Pages表並且取消對Enable Session State選項的選擇。 
你還可以在特定的Active Server Page的首行加入使之屏蔽的語句來進行這種操 

作。 
<% EnableSessionState=False %> 
由於Session對象使用了CookIEs,那麼它的兼容性就受到了限制,一些老的浏覽 

器顯然是不行的,新的浏覽器象是NetScape4.0也提供了屏蔽CookIE的選項。 
這樣就出了問題、由於CookIE不能適用於所有浏覽器,那麼在建站時你就必須注 

意了,如果你的網站定位於大眾通用,就必須考慮各種不同的用戶情況。不過現 

在確實有可以替代的方法,有些取代CookIEs來進行身份認證的方法將在後面的 

章節中進行討論。 
注:當前浏覽器,是否發送一個CookIE在URL是區分大小寫的,因此,微軟提醒你 

最好使用同樣的大小寫方式,例如一起使用/WWW/mypage.asp和/www/mypage.ASP 

肯定會使浏覽器出錯。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved