ASP.NET中Cookie编程的基础知识(5)
2024-07-10 13:01:54
供稿:网友
读取 cookie 集合
前面的示例假设您要读取名称已知的 cookie。有时,您可能需要读取可供页面使用的所有 cookie。要读取可供页面使用的所有 cookie 的名称和值,您可以利用如下代码遍历 request.cookies 集合:
dim i as integer
dim output as string = ""
dim acookie as httpcookie
for i = 0 to request.cookies.count - 1
acookie = request.cookies(i)
output &= "cookie 名称 = " & server.htmlencode(acookie.name) & "<br>"
output &= "cookie 值 = " & server.htmlencode(acookie.value) & _
& "<br><br>"
next
label1.text = output
注意:运行此代码时,您很可能会看到一个名为“asp.net_sessionid”的 cookie,asp.net 用这个 cookie 来保存您的会话的唯一标识符。这个会话 cookie 不会永久保存到您的硬盘上。有关会话 cookie 的详细信息,请参阅本文后面的 cookie 和会话状态。
前面的示例有一个限制:如果 cookie 有子键,就会以一个单独的名称/值字符串来显示子键。cookie 的 haskeys(英文)属性可以告诉您该 cookie 是否有子键。如果有子键,您可以在子键集合中向下钻取,获取各个子键的名称和值。
如前文所述,您可以从 cookie 属性 values(英文)中获取有关子键的信息,该属性是类型 namevaluecollection 的集合。您可以根据索引值从 values 集合中直接读取子键值。相应的子键值可以从 values 集合的成员 allkeys(英文)中得到,该成员将返回一个字符串集合。
以下示例是对前一示例的修改。示例中使用 haskeys 属性来测试子键,如果检测到子键,就从 values 集合中获取子键:
dim i as integer
dim j as integer
dim output as string = ""
dim acookie as httpcookie
dim subkeyname as string
dim subkeyvalue as string
for i = 0 to request.cookies.count - 1
acookie = request.cookies(i)
output &= "名称 = " & acookie.name & "<br>"
if acookie.haskeys then
for j = 0 to acookie.values.count - 1
subkeyname = server.htmlencode(acookie.values.allkeys(j))
subkeyvalue = server.htmlencode(acookie.values(j))
output &= "子键名称 = " & subkeyname & "<br>"
output &= "子键值 = " & subkeyvalue & "<br><br>"
next
else
output &= "值 = " & server.htmlencode(acookie.value) & "<br><br>"
end if
next
label1.text = output
您也可以把子键作为 namevaluecollection 对象进行提取,如下所示:
if acookie.haskeys then
dim cookievalues as _
system.collections.specialized.namevaluecollection = acookie.values
dim cookievaluenames() as string = cookievalues.allkeys
for j = 0 to cookievalues.count – 1
subkeyname = server.htmlencode(cookievaluenames(j))
subkeyvalue = server.htmlencode(cookievalues(j))
output &= "子键名称 = " & subkeyname & "<br>"
output &= "子键值 = " & subkeyvalue & "<br><br>"
next
else
output &= "值 = " & acookie.value & "<br><br>"
end if
注意:请记住,我之所以调用 server.htmlencode 方法,只是因为我要在页面上显示 cookie 的值。如果您只是测试 cookie 的值,就不必在使用前对其进行编码。
修改和删除 cookie
有时,您可能需要修改某个 cookie,更改其值或延长其有效期。(请记住,由于浏览器不会把有效期信息传递到服务器,所以您无法读取 cookie 的过期日期。)
当然,实际上您并不是直接更改 cookie。尽管您可以从 request.cookies 集合中获取 cookie 并对其进行操作,但 cookie 本身仍然存在于用户硬盘上的某个地方。因此,修改某个 cookie 实际上是指用新的值创建新的 cookie,并把该 cookie 发送到浏览器,覆盖客户机上旧的 cookie。
以下示例说明了如何更改用于储存站点访问次数的 cookie 的值:
dim counter as integer
if request.cookies("counter") is nothing then
counter = 0
else
counter = cint(request.cookies("counter").value)
end if
counter += 1
response.cookies("counter").value = counter.tostring
response.cookies("counter").expires = datetime.now.adddays(1)
或者:
dim ctrcookie as httpcookie
dim counter as integer
if request.cookies("counter") is nothing then
ctrcookie = new httpcookie("counter")
else
ctrcookie = request.cookies("counter")
end if
counter = cint(ctrcookie.value) + 1
ctrcookie.value = counter.tostring
ctrcookie.expires = datetime.now.adddays(1)
response.cookies.add(ctrcookie)