谈ASP.NET中cookie的应用

2022-12-05

1 Cookie对象的特点

Cookies是一种种集合对象, 是用来保存数据的。但是Cokies和其他对象最大的不同是C o o k i e s将数据存放于客户端的磁盘上, 而Applications以及Sessions对象是将数据存放于服务器端, 浏览器对C o o k i e对象的大小有限制, 只有不超过4 0 9 6 B才能保证被接受。

2 Cookie的用途

最根本的用途是Cookie能够帮助Web站点保存有关访问者的信息。更概括地说, Cookie是一种保持Web应用程序连续性 (即执行“状态管理”) 的方法。浏览器和W e b服务器除了在短暂的实际信息交换阶段以外总是断开的, 而用户向W e b服务器发送的每个请求都是单独处理的, 与其他所有请求无关。然而在大多数情况下, 都有必要让W e b服务器在请求某个页面时对用户进行识别。例如, 购物站点上的W e b服务器跟踪每个购物者, 以便站点能够管理购物车和其他的用户相关信息。因此C o o k i e的作用就类似于名片, 它提供了相关的标识信息, 可以帮助应用程序确定如何继续执行。

3 Cookie的限制

大多数浏览器支持最多可达4 0 9 6字节的Cookie, 如果要将为数不多的几个值保存到用户计算机上, 这一空间已经足够大, 但不能用一个Cookie来保存数据集或其他大量数据。在实际应用中, 可能并不希望在Cookie中保存大量的用户信息, 而只希望保存用户编号或其他标识符。之后, 当用户再次访问站点时, 就可以使用该用户I D在数据库中查找用户的详细信息。

浏览器还限制了站点可以在用户计算机上保存的Cookie数。大多数浏览器只允许每个站点保存20个Cookie。如果试图保存更多的Cookie, 则最先保存的Cookie就会被删除。还有些浏览器会对来自所有站点的C o o k i e总数作出限制, 这个限制通常为300个。

最可能遇到的C o o k i e限制是:用户可以设置自己的浏览器, 拒绝接受C o o k i e。解决这个问题很难, 除非服务完全不使用Cookie而是通过其他机制来保存用户相关信息。保存用户信息的一种常用方法是会话状态, 但会话状态又依赖于C o o k i e。

尽管C o o k i e在应用程序中非常有用, 应用程序也不应该依赖于能够保存Cookie。利用Cookie可以做到锦上添花, 但不要利用它们来支持关键功能。如果应用程序必须使用C o o k i e, 则可以通过测试来确定浏览器是否接受C o o k i e。

4 编写Cookie

可以利用页面的Response属性来编写C o o k i e, 该属性提供的对象使用户可以将信息添加到由页面向浏览器呈现的信息中。Response对象支持一个名为Cookies的集合, 可以向其中添加要写入浏览器的Cookie。

在创建C o o k i e时, 需要指定几个值。最初, 要指定C o o k i e的名称和其中保存的值。可以创建多个Cookie, 每个Cookie都必须具有唯一的名称, 以便日后读取时识别。

有时可能还希望指定Cookie的过期日期和时间。Cookie一般都写入到用户的磁盘, 然后可能一直都留在磁盘上。因此, 可以指定Cookie过期的日期和时间。当用户再次访问站点时, 浏览器会先检查站点的Cookie集合, 如果某个C o o k i e已经过期, 浏览器不会把这个C o o k i e随页面请求一起发送给服务器, 而是删除这个已经过期的Cookie。

4.1 Cookie的有效期

一个Cookie的有效期应为多长?这取决于Cookie的用途, 换句话说, 取决于应用程序需要C o o k i e值保持有效的时间有多长。如果利用C o o k i e统计网站的访问者, 可以把有效期设置为1年, 如果某个用户已有一年时间未访问站点, 则可以把该用户当作新的访问者;如果利用C o o k i e来保存用户的首选项, 则可以把其设置为永远有效 (例如5 0年后到期) , 因为定期重新设置首选项对用户而言是比较麻烦的。有时, 可能需要编写在数秒或数分钟内即过期的Cookie。

用户随时可以删除自己计算机上的Cookie, 所以即使保存了长期有效的Cookie用户也可以自行决定将其全部删除, 同时清除保存在Cookie中的所有设置。

如果没有设置Cookie的有效期, 还是可以创建Cookie, 但它不会保存到用户的硬盘上, 而是会成为用户会话信息的一部分。如果用户关闭浏览器或会话超时, 该C o o k i e就会被删除。这种非永久性的Cookie很适合用来保存只需短时间保存的信息, 或者保存由于安全原因不应该写入客户计算机磁盘的信息。例如, 如果用户使用的是一台公用计算机, 而您不希望把C o o k i e写入这种计算机的磁盘上, 这时就可以使用非永久性的Cooki。

4.2 向浏览器写入一个Cookie

可以通过多种方法把C o o k i e添加到Response.Cookies集合中。以下示例介绍了两种完成此任务的方法:

该示例向C o o k i e s集合中添加了两个Cookie, 一个称为“userName”, 另一个称为“lastVisit”。对于第一个Cookie, 直接设置了Response.Cookies集合的值。可以使用这种方法向集合中添加值, 因为R e s p o n s e.Cookies是从Name Object CollectionBase类型的特殊集合派生得到的。

对于第二个Cookie, 创建了Cookie对象的一个实例 (HttpCookie类型) , 并设置了其属性, 然后通过A d d方法把它添加到Response.Cookies集合。实例化HttpCookie对象时, 必须把Cookie名称作为构造函数的一部分进行传递。

这两个示例完成了相同的任务, 即向浏览器写入一个Cookie。要采用哪种方法主要取决于个人喜好。可能第二种方法在设置C o o k i e属性方面要稍微容易一些, 但同时也注意到两者的差别并不是很大。

在这两种方法中, 有效期值必须为DateTime类型。而“lastVisited”值也是日期/时间值。但在这种情况下, 必须把日期/时间值转换为字符串, 因为Cookie中的任何值最终都是以字符串的形式保存的。

5 查看Cookie

查看Cookie的一个简便方法是让Internet Explorer查找。在Internet Explorer中, 从“工具”菜单中选择“Internet选项”, 在“常规”选项卡中单击“设置”, 然后单击“查看文件”。Internet Explorer将打开一个窗口, 显示所有的临时文件, 包括C o o k i e。在窗口中查找以“Cookie:”开头的文件或查找文本文件。双击一个C o o k i e, 在默认的文本文件中打开它。

可以在硬盘上查找Cookie的文本文件, 从而打开Cookie。InternetExplorer将站点的Cookie保存在文件名格式为@.txt的文件中, 其中@前面是帐户名。例如, 如果用户名称为y q l, 您访问的站点为w w w.contoso.com, 那么该站点的Cookie将保存在名为yql@www.contoso.txt的文件中。 (该文件名可能包含一个顺序的编号, 如yql@www.contoso[1].txt) 。这个Cookie文本文件是与用户相关的, 所以会按照帐户分别保存。例如, 在Windows XP中, 您可以在如下所示的目录中找到Cookie文件:

c:Documents and Settingsyql下。

6 多值Cookie

以上示例为每个要保存的值 (用户名、上次访问时间) 都使用了一个Cookie。也可以在一个Cookie中保存多个名称/值对。名称/值对也称作“键”或“子键”, 具体取决于您读取的内容。例如, 如果不希望创建名为“userName”和“lastVisit”的两个单独的Cookie, 可以创建一个名为“userInfo”的Cookie, 并使其包含两个子键:“userName”和“lastVisit”。

有很多原因会让我们用子键来代替单独的Cookie。最显而易见的是, 把相关或类似的信息放在一个Cookie中会比较有条理。另外, 由于所有信息都在一个C o o k i e中, 所以诸如有效期之类的C o o k i e属性就适用于所有信息。 (当然, 如果要为不同类型的信息指定不同的过期日期, 就应该把信息保存在单独的Cookie中。)

带有子键的C o o k i e还可以帮助减小Cookie的大小。Cookie的总大小限制在4 0 9 6字节以内, 而且不能为一个网站保存超过2 0个C o o k i e。利用带子键的单个Cookie, 站点的Cookie数量就不会超过20个的限制。此外, 一个Cookie会占用大约5 0个字符的基本空间开销 (用于保存有效期信息等) , 再加上其中保存的值的长度, 其总和接近4 K的限制。如果使用五个子键而不是五个单独的C o o k i e, 可以省去四个C o o k i e的基本空间开销, 总共能节省大约200个字节。

7 结语

在使用C o o k i e对象验证使用者时, 必须考虑到身份验证的问题。因为使用者可能在非私人的计算机上浏览, 或是个人计算机的安全性防护不完善, 导致其他人可能使用同一个浏览器上网, 这样一来任何人都可以顺利通过Cookie对象的验证。对于有机密考虑的数据或是有价交易的处理, 势必造成漏洞, 设计这方面的网站时, 要仔细考虑Cookie的应用。

以前的Session对象使用时要打开浏览器的Cookie支持, IE的默认值是开启。不过在ASP.NET中就算不开启浏览器的Cookie支持也可以让S e s s i o n动作, 只要在W e b.config配置中加入就可以让Session不再依赖Cookie;但是此时的W e b.c o n f i g文件一定要放在w w w的根目录里, 也就是预设的C:Inetpubwwwroot里。

摘要:本文概要介绍Cookie在ASP.NET应用程序中的应用, 展示了在ASP.NET中应用Cookie的技术细节, 同时还介绍Cookie的各种特性以及ASP.NET对Cookie的支持。

关键词:Cookie,特性,支持

参考文献

[1] 李德奇.ASP.NET程序设计[M].北京:人民邮电出版社.

[2] 翁健红.基于C#的ASP.NET程序设计[M].北京:机械工业出版社.

上一篇:中等职业学校学生教学实习的有效管理下一篇:基于RMF的成品油销售企业客户分类管理研究