asp教程.net cookie详解使用方法
cookie 提供了一种在 web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。
if (page.request.cookies[domain] == null)
{
httpcookie cookies = new httpcookie(domain);//定义cookie对象
cookies.values[keys] = values;
datetime dts = datetime.now;//定义时间对象
timespan ts = new timespan(0, 0, 20, 0);//cookie有效作用时间
cookies.expires = dts.add(ts);//添加作用时间
//cookies.domain = ".hnzbtb.com"; 下级域名通用
page.response.cookies.add(cookies);
}
else
{
httpcookie cookies = page.request.cookies[domain];
cookies.values[keys] = values;
datetime dts = datetime.now;//定义时间对象
timespan ts = new timespan(0, 0, 20, 0);//cookie有效作用时间,具体查msdn
cookies.expires = dts.add(ts);//添加作用时间
//cookies.domain = ".hnzbtb.com";
page.response.cookies.add(cookies);
}
控制 cookie 的范围
默认情况下,一个站点的全部 cookie 都一起存储在客户端上,而且所有 cookie 都会随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得该站点的所有 cookie。但是,可以通过两种方式设置 cookie 的范围:
将 cookie 的范围限制到服务器上的某个文件夹,这允许您将 cookie 限制到站点上的某个应用程序。
将范围设置为某个域,这允许您指定域中的哪些子域可以访问 cookie。
将 cookie 限制到某个文件夹或应用程序
若要将 cookie 限制到服务器上的某个文件夹,请按下面的示例设置 cookie 的 path 属性:
vbc#c++f#jscript
复制dim appcookie as new httpcookie("appcookie")
appcookie.value = "written " & datetime.now.tostring()
appcookie.expires = datetime.now.adddays(1)
appcookie.path = "/application1"
response.cookies.add(appcookie)
注意
还可以通过将 cookie 直接添加到 cookies 集合的方式来编写 cookie,如先前的示例所示。
路径可以是站点根目录下的物理路径,也可以是虚拟根目录。所产生的效果是 cookie 只能用于 application1 文件夹或虚拟根目录中的页面。例如,如果您的站点名称为 www.contoso.com,则在前面示例中创建的 cookie 将只能用于路径为 http://www.contoso.com/application1/ 的页面以及该文件夹下的所有页面。但是,cookie 将不能用于其他应用程序中的页面,如 http://www.contoso.com/application2/ 或 http://www.contoso.com/ 中的页面。
注意
在某些浏览器中,路径区分大小写。您无法控制用户如何在其浏览器中键入 url,但如果应用程序依赖于与特定路径相关的 cookie,请确保您创建的所有超链接中的 url 与 path 属性值的大小写相匹配。
限制 cookie 的域范围
默认情况下,cookie 与特定域关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的 cookie 就会被发送到服务器。(这可能不包括带有特定路径值的 cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 cookie 与特定的子域关联。若要执行此操作,请设置 cookie 的 domain 属性,如此示例所示:
vbc#c++f#jscript
复制response.cookies("domain").value = datetime.now.tostring()
response.cookies("domain").expires = datetime.now.adddays(1)
response.cookies("domain").domain = "support.contoso.com"
当以此方式设置域时,cookie 将仅可用于指定的子域中的页面。还可以使用 domain 属性创建可在多个子域间共享的 cookie,如下面的示例所示:
vbc#c++f#jscript
复制response.cookies("domain").value = datetime.now.tostring()
response.cookies("domain").expires = datetime.now.adddays(1)
response.cookies("domain").domain = "contoso.com"
随后 cookie 将可用于主域,也可用于 sales.contoso.com 和 support.contoso.com 域。
读取 cookie
浏览器向服务器发出请求时,会随请求一起发送该服务器的 cookie。在 asp.net教程 应用程序中,可以使用 httprequest 对象读取 cookie,该对象可用作 page 类的 request 属性使用。httprequest 对象的结构与 httpresponse 对象的结构基本相同,因此,可以从 httprequest 对象中读取 cookie,并且读取方式与将 cookie 写入 httpresponse 对象的方式基本相同。下面的代码示例演示两种方法,通过这两种方法可获取名为 username 的 cookie 的值,并将其值显示在 label 控件中:
vbc#c++f#jscript
复制if not request.cookies("username") is nothing then
label1.text = server.htmlencode(request.cookies("username").value)
end ifif not request.cookies("username") is nothing then
dim acookie as httpcookie = request.cookies("username")
label1.text = server.htmlencode(acookie.value)
end if
在尝试获取 cookie 的值之前,应确保该 cookie 存在;如果该 cookie 不存在,将会收到 nullreferenceexception 异常。还请注意在页面中显示 cookie 的内容前,先调用 htmlencode 方法对 cookie 的内容进行编码。这样可以确保恶意用户没有向 cookie 中添加可执行脚本。有关 cookie 安全性的更多信息,请参见“cookie 和安全性”一节。
注意
由于不同的浏览器存储 cookie 的方式不同,因此,同一计算机上的不同浏览器没有必要能够读取彼此的 cookie。例如,如果使用 internet explorer 测试一个页面,然后再使用其他浏览器进行测试,那么后者将不会找到 internet explorer 保存的 cookie。
读取 cookie 中子键值的方法与设置该值的方法类似。下面的代码示例演示获取子键值的一种方法:
vbc#c++f#jscript
复制if not request.cookies("userinfo") is nothing then
label1.text = _
server.htmlencode(request.cookies("userinfo")("username"))
label2.text = _
server.htmlencode(request.cookies("userinfo")("lastvisit"))
end if
在上面的示例中,代码读取子键 lastvisit 的值,该值先前被设置为字符串表示形式的 datetime 值。cookie 将值存储为字符串,因此,如果要将 lastvisit 值作为日期使用,必须将其转换为适当的类型,如此示例所示:
vbc#c++f#jscript
复制dim dt as datetime
dt = datetime.parse(request.cookies("userinfo")("lastvisit"))
cookie 中的子键被类型化为 namevaluecollection 类型的集合。因此,获取单个子键的另一种方法是获取子键集合,然后再按名称提取子键值,如下面的示例所示:
vbc#c++f#jscript
复制if not request.cookies("userinfo") is nothing then
dim userinfocookiecollection as _
system.collections.specialized.namevaluecollection
userinfocookiecollection = request.cookies("userinfo").values
label1.text = _
server.htmlencode(userinfocookiecollection("username"))
label2.text = _
server.htmlencode(userinfocookiecollection("lastvisit"))
end if
更改 cookie 的到期日期
浏览器负责管理 cookie,而 cookie 的到期时间和日期可帮助浏览器管理 cookie 的存储。因此,虽然可以读取 cookie 的名称和值,但无法读取 cookie 的到期日期和时间。当浏览器向服务器发送 cookie 信息时,并不包括有效期信息。(cookie 的 expires 属性始终返回值为 0 的日期时间值。)如果您担心 cookie 的到期日期,必须重新设置该 cookie,该过程在“修改和删除 cookie”一节中介绍。
注意
可以在向浏览器发送 cookie 之前读取已在 httpresponse 对象中设置的 cookie 的 expires 属性。但是,您无法从返回的 httprequest 对象中获取有效期。
读取 cookie 集合
有时,您可能需要读取可供页面使用的所有 cookie。若要读取可供页面使用的所有 cookie 的名称和值,可以使用如下代码依次通过 cookies 集合。
vbc#c++f#jscript
复制dim i as integer
dim output as system.text.stringbuilder = new system.text.stringbuilder
dim acookie as httpcookie
for i = 0 to request.cookies.count - 1
acookie = request.cookies(i)
output.append("cookie name = " & server.htmlencode(acookie.name) _
& "<br />")
output.append("cookie value = " & _
server.htmlencode(acookie.value) & "<br /><br />")
next
label1.text = output.tostring()
注意
在运行此代码时,可能会看到一个名为 asp.net_sessionid 的 cookie。asp.net 使用该 cookie 来存储您的会话的唯一标识符。会话 cookie 不会保存在您的硬盘上。有关会话 cookie 的更多信息,请参见本主题后面的“cookie 和会话状态”一节。