asp

位置:IT落伍者 >> asp >> 浏览文章

在ASP中访问和更新Cookies集合


发布日期:2018年07月27日
 
在ASP中访问和更新Cookies集合

Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多Cookie是一小块由浏览器存贮在客户端系统上的文本且随同每次请求发往它们应用于的域中的服务器

ASP使得应用cookie较为容易可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值并可创建或修改cookie通过Response对象的Cookies集合发回给用户

Cookie包含可用两种方式构造的信息单值cookie提供其值给代码是通过一个一般的类ASP集合然而集合的每个成员可能本身也是一个集合包含这种信息的cookie通过称为多值(multipleValue)cookie

创建一个单值的cookie较为简单如下所示

ResponseCookies(“itemname”) = “itemvalue”
创建一个多值的cookie可以使用如下命令

ResponseCookies(“itemname”)(“subitemname”) = “subitemvalue”
设置cookie应用的域及路径及其有效期我们使用

ResponseCookies(“itemname”)domain = “domainurl”
ResponseCookies(“itemname”)path = “virtualpath”
ResponseCookies(“itemname”)expires = #date#
通常客户只在对创建cookie的目录中的页面提出请求时才将cookie随请示发住服务器通过指定path属性可以指定站点中何处这个cookie是合法的并且这个cookie将随请求发送如果cookie随对整个站点的页面请求发送设置path为“/”

假如Expires属性没有设置关闭当前的浏览器实例时cookie将被自动消除

注意我们在向浏览器发送任何输出时已经创建了cookie因为这些cookie是页面HTTP报头的一部分

在ASP 缓沖的缺省状态是打开的且没有输出被发送除非使用ResponseFlush指定做这个工作或者页面已到末端这意味着创建cookie的代码可以在页面上的任何位置直到任何输出“刷新”(flush)到客户端前它都可以被执行

要读现有的cookie使用RequestCookies集合可以单独访问其中的项目方法类似于创建它们时使用的方法

StrSingleValue = RequestCookies(“itemname”)
StrSubItemValue = RequestCookies(“itemname”)(“subitemname”)
注意RequestCookies集合(和所有其他Request集合一样)是只读的ResponseCookies集合是只写的事实上可以访问这个集合中一系列cookie的名称而不是它们的值

遍历Cookies集合

为了使用Cookies集合更加方便可使用名称为Haskeys的附加属性假如访问的cookie本身也是个集合即它是一个多值的cookie这将返回True使用Haskeys属性可以遍历完整的RequestCookies集合从而获得所有cookie的列表及它们的值

For Each objItem In RequestCookies
If RequestCookies(objItem)HasKey Then
‘Use another For Each to iterate all subkeys
For Each objItemKey in RequestCookies(objItem)
ResponseWrite objItem & “(“ & objItemKey & “) = “_
& RequestCookies(objItem)(objItemKey) & “<BR>”
Next
Else
‘Print out the cookie string as normal
ResponseWrite objItem & “ = ”& RequestCookies(objItem) & “<BR>”
End If
Next
这非常类似于前面的从RequestForm集合中提取多个值的复杂代码但是这里可以使用Haskeys属性来判别每个条目是否为一个集合而在Form例子里必须查询RequestForm(item_name)Count属性这是因为Form集合(和所有的除cookie外的其他集合)成员不可能是真正的集合ASP只是做了“幕后”的工作得到了每个多条目集合的值

Form和QueryString的差异

了解了访问各种ASP集合的技术以后需要解决另一个问题是Form和QueryString集合之间的差异是什么?假如准备使用ASP毫无疑问应该清楚这种差异但需要参考HTTP工作方式来重新认识理解它们

通过HTTP从Web服务器请求页面或其他资源有两个通用的方法可使用GET方法直接获得资源也可使用POST把值传给相应资源GET方法是缺省的可以看一下本章前面的一个HTTP请求的实例

// :: Sent GET /Store/Downloadasp HTTP/

假如把一个或多个成对的名称/值附在请求页面的URL后就变成请求的查询字符串且在QueryString集合中提供给ASP页面单击Web页面Email消息或其它文档的超链接或在浏览器的地址栏中输入地址并按回车或单击浏览器中的Links或Favorites按钮所有这些都要使用GET方法

因此对这些动作中传递值给ASP的唯一方法是通过QueryString集合把值附在URL后

出现在RequestQueryString集合中并被访问的值与前面看到的Form集合实例中的工作方式相同URL和查询字符串的结合



可以采用如下方式访问在QueryString集合中提供的值

strFirstName = RequestQueryString(“FirstName”) ‘Return “Priscilla”
strLastName = RequestQueryString(“LastName”) ‘Return “Descartes”
strRaw = RequestQueryString
‘Return “FirstName=Priscilla&LastName=Descartes”
窗体的GET和POST方法

在一个页面内使用<FORM>段时可以设置打开的FORM标记的METHOD属性值为“GET”或“POST”缺省值为“GET”假如使用“GET”或省略其属性浏览器将该值绑定在页面所有控件上成为一个查询字符串且附在被请求页面的URL上

当这个请求到达Web服务器时其值由ASP的RequestQueryString集合提供然而假如设置METHOD属性为“POST”浏览器将值包装进发送服务器的HTTP报头中通过RequestForm集合提供给ASP

通过来说可以在所有的HTML窗体中使用POST方法然而浏览器或服务器的URL字符串长度存在一定的限制因此附有长的字符串可能会引起溢出和某些字符串的字符被截掉同时查询字符串出现在浏览器的地址栏和所有的保存的链接和收藏夹中不仅如此还显露了通过Web服务器时在HTTP请求中不想显示的值它也可能出现你的服务器和其他路由服务器的日志文件中在HTTP请求报头中的值很少是可见的并且不出现在日志文件中

使用POST方法需要注意的小问题是当用户重新下载<FORM>时窗体的值将不再保留其值为空且必须重新输入然而当附在URL上时其值被存储为一个链接将被保留因此将出现在所有的URL与字符串结合的请求中这或许是个优点也可能是个缺点这根据应用而定(一些浏览器在客户端上能够在一定范围内自动保留一个页面上的值)

另一点是URL与查询字符串的结合体不能包含任何空格或其他非法字符否则的话Navigator和一些其他的浏览器将出现问题非法字符是那些用来分隔URL和查询字符串的部分例如“/”“:”“?”和“&”(IE能够自动将空格转换为正确的格式——加号“+”但其他的非法字符不能处理)

ASP中的cookie的使用

在这一节我们将学习那些提供给ASP代码使用的集合方法和属性的各种技术

) cookie中存储用户的细节情况

可以使用cookie来存储这两类值当浏览器关闭时我们不想保存的值(例如用户的注册信息)以及在用户访问站点时要保留的值在每种情况下cookie的值对于来自用户浏览器的每个页面请求的ASP都是可用的

然而需要记住的是cookie只有在对Cookie中的虚拟路径(path)内的页面发出请求时才会发往服务器缺省时假如path的值在cookie中没有设置则其值为创建cookie的页面的虚拟路径为使一个cookie发往一个站点的所有页面需要使用path=“/”
这里是个实例从自定义的Login页面中将用户的注册信息存贮在一个cookie中由于没有应用有效期cookie值仅在关闭这个浏览器这前保留


RequestCookies(“User”)(“UID”) = “<% = Request(“UserName”) %>”
RequestCookies(“User”)(“PWD”) = “<% = Request(“Password”) %>”
RequestCookies(“User”)Path = “/adminstuff” ‘Only applies to admin pages

现在在用户从adminstuff目录或其子目录请求的每个页面中都可以找到这个cookie假如它不存在可以将用户重定向到注册页面

If (RequestCookies(“User”)(“UID”) <> “alexhomer”) _
Or (RequestCookies(“User”)(“PWD”) <> “secret”) Then
ResponseRedirect “loginasp?UserName=” & RequestCookies(“User”)(“UID”)
End If

由于把cookie中的用户名放在ResponseRedirect的URL查询字符串中假如在口令输入时出现错误且希望用户不必重新键入用户名可以在loginasp页面中使用它

<FORM ACTION=”check_userasp” METHOD=”POST”>
<INPUT TYPE=”TEXT” NAME=”UserName”
VALUE=”<% = RequestQueryString(“UserName”) %>”><P>
<INPUT TYPE=”SUBMIT” VALUE=”LOGIN”>
</FORM>
) 修改现有的cookie

可以使用ASP修改现有的cookie但不能只修改cookie中的一个值当更新一个在ResponseCookies集合中的Cookie时现有的值将丢失我们可以用如下代码创建一个cookie可以使用

ResponseCookies(“VisitCount”)(“StartDate”) = dtmStart
ResponseCookies(“VisitCount”)(“LastDate”) = Now
ResponseCookies(“VisitCount”)(“Visits”) = CStr(intVisits)
ResponseCookies(“VisitCount”)Path = “/” ‘Apply to entire site
ResponseCookies(“VisitCount”)Expires = DateAdd(“m”Now)
假如想要更新Visits和LastDate的值必须先不需改变的所有值然后重写整个的cookie

datDtart = ResponseCookies(“VisitCount”)(“StartDate”)
intVisits = ResponseCookies(“VisitCount”)(“Visits”)
ResponseCookies(“VisitCount”)(“StartDate”) = dtmStart
ResponseCookies(“VisitCount”)(“LastDate”) = Now
ResponseCookies(“VisitCount”)(“Visits”) = Cstr(intVisits)
ResponseCookies(“VisitCount”)Path = “/”
ResponseCookies(“VisitCount”)Expires = DateADD(“m”Now + )且对于几乎所有的其他Response方法和属性应该在写入任何内容(即打开<HTML>标记或任何文本或其他的HTML)到响应之前完成这个工作

上一篇:ASP生成图片彩色校验码

下一篇:asp判断用户是否注册代码