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)