当前位置: 首页 > 图文教程 > 网络编程 > ASP > cookies和session的关系

ASP
ASP基础讲座(下)
解决IIS5 HTTP500内部错误
ASP 3.0高级编程(四十六)
ASP 3.0高级编程(四十五)
ASP 3.0高级编程(四十四)
ASP 3.0高级编程(四十三)
ASP 3.0高级编程(四十二)
ASP 3.0高级编程(四十一)
ASP 3.0高级编程(三十九)
ASP 3.0高级编程(三十八)
ASP 3.0高级编程(三十七)
ASP 3.0高级编程(三十六)
ASP 3.0高级编程(三十五)
ASP 3.0高级编程(三十四)
ASP 3.0高级编程(三十三)
ASP 3.0高级编程(三十二)
ASP 3.0高级编程(三十一)
ASP错误代码说明
jscript错误代码及相应解释大全
ASP错误处理

ASP 中的 cookies和session的关系


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 39 ::
收藏到网摘: n/a

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 "您已是第" & Num & "次访问本站点了。" 
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&Gender=male&Myheight=172 
如果用户没有指定“子键”名而直接引用Cookies变量,将会返回一个包含 

所有的“子键”名及值的字符串。例如上面这个例子包含三个“子键”:"Mynam 

e"、"Gender"和"Myheight",当用户没有指定其“子键”而直接通过Request.Co 

okies("info")来引用时,则会得到下列字符串: 
info=Myname=jeff&Gender=male&Myheight=172 
如果要把Cookie中读取的所有数据,可以用下面的代码得到: 
<%For each cookie in Request.Cookies 
if Not cookie.HasKeys then 
Response.write cookie & "=" & Request.Cookies(cookie) 
Else 
for each key in Request.Cookies(cookie) 
Response.write cookie&"("&key&")"&"="& 

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) &"-" 
Response.write Session("info")(1) &"-" 
Response.write Session("info")(2) &"<br>" 
%> 
<hr> 
<% 
array(0)="jun" 
array(1)="li" 
array(2)="female" 
Session("info")=array 
Response.write Session("info")(0) & "-" 
Response.write Session("info")(1) & "-" 
Response.write Session("info")(2) & "<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 

肯定会使浏览器出错。