深刻理解Cookies的方方面面(基础/高级)
一、简介Cookies一定是大家都知道的,但不是每个人都精通。这篇文章解释了Cookies的所有方面。2.基础知识1。什么是CookiesCookie是一小段文本信息,它与用户请求和页面一起在网络服务器和浏览器之间传输。Cookie包含用户每次访问网站时Web应用程序可以读取的信息。例如,如果应用程序不仅向用户发送了一个页面,还发送了一个包含用户在站点中请求页面的日期和时间的Cookie,则用户的浏览器会在获取页面的同时获取该Cookie,并将其存储在用户硬盘上的文件夹中。将来,如果用户再次请求您站点中的页面,当用户输入URL时,浏览器将在本地硬盘中搜索与该URL关联的Cookie。如果Cookie存在,浏览器会将Cookie与页面请求一起发送到您的站点。然后,应用程序可以确定用户上次访问该站点的日期和时间。您可以使用此信息向用户显示消息或检查到期日期。Cookie与网站相关联,而不是与特定页面相关联。因此,无论用户在站点中请求哪个页面,浏览器和服务器都会交换Cookie信息。当用户访问不同的站点时,每个站点可能会发送一个Cookie到用户的浏览器。浏览器单独存储所有Cookie。Cookie帮助网站存储访问者的信息。一般来说,Cookie是维护Web应用程序连续性的一种方式,即执行状态管理。除了实际信息交换时间短之外,浏览器和Web服务器是断开的。网络服务器将分别处理用户发送给网络服务器的每个请求。然而,在许多情况下,当用户请求页面时,网络服务器识别用户是非常有用的。例如,购物网站上的网络服务器跟踪每个购物者,这样网站就可以管理购物车和其他特定于用户的信息。因此,Cookie可以用作名片,提供相关的识别信息来帮助应用程序确定如何继续执行。Cookie可以达到很多目的,所有这些都是为了帮助网站记住用户。例如,进行民意调查的网站可以简单地将Cookie作为布尔值,并使用它来指示用户的浏览器是否参与了投票,这样用户就不能进行第二次投票。需要用户登录的网站可以记录用户已经通过Cookie登录,这样用户就不必每次都输入凭据。2.如何存储Cookies Cookies存储在用户的本地机器上,不同的浏览器存储在不同的文件夹中,根据域名分别存储。也就是说,网站之间的Cookies不会互相覆盖。IE浏览器的用户可以在本地文档中找到Cookies的txt文件,不同操作系统的位置不同。windows server 2003/xp存储在文件夹c: \文档和设置\管理员\ cookies中。名称txt根据域名保存,例如localhost域中的cookies为:[emailprotected][1]。txt或[emailprotected][2]。txt,后者[1]和[2]随着每次保存交替变化。3.如何传递cookie cookie的信息在网络服务器和浏览器之间传递。保存在Http请求中。
(1)请求页面在请求一个页面的超文本传送协议(超文本传输协议的缩写)头中,会将属于此页面的本地饼干信息加在超文本传送协议(超文本传输协议的缩写)头中,注意下面加粗的部分:复制代码代码如下: get/Cookies/test。aspx HTTP/1.1主机: localhost :1335用户代理: Mozilla/5.0(Windows;u;windows NT 5.2zh-CN;房车:1。9 .1 .1)Gecko/20090715火狐/3。5 .1辆GTB5(1辆.接受:文本/html,应用程序/xhtml xml,应用程序/XML;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.5 Accept-Encoding: gzip,deflate Accept-charset : GB2312,utf-8;q=0.7,*;q=0.7保持活动: 300连接:保持活动cookie : My .常见。TestCookieInfo=Pkid=999 test value=aaabcccddee(2)页面响应如果页面要求写入饼干信息,则返回的超文本传送协议(超文本传输协议的缩写)如下,注意加粗的部分:复制代码代码如下:HTTP/1.x 200 OK服务器: ASP。网开发服务器/9.0.0.0日期: 2009年8月6日星期四0:40:59 GMT X-AspNet-版本: 2。0 .50727设置cookie :我的.常见。TestCookieInfo=Pkid=999 test value=aaabcccddee;到期=Fri,07-08-2009 03:40:59格林尼治标准时间;路径=/缓存控制:私有内容-:型文本/html;字符集=utf-8内容-长度: 558连接:关闭4。饼干如何查看(1)查看饼干的文本文件(文本文件)文件工业管理学(工业工程)用户可以直接查看饼干的文本文件(文本文件)文件。比如:C: \文档和设置\管理员\ cookie \[电子邮件保护][1]。txt(2)使用插件消防下使用网络开发者插件可以很方便的查看、删除和修改Cookies:插件截图
参见页面cookie:(9501 . 163.com)。
饼干高级知识1。cookie的限制大多数浏览器支持最大大小为4096字节的cookie。浏览器也限制了网站可以存储在用户计算机上的Cookie的数量。大多数浏览器只允许每个站点存储20个Cookie;请注意,这里的20指的是主键值,也就是20个cookie记录,但是每个cookie记录也可以包含几个子项,这将在下面详细解释。如果您尝试存储更多的cookie,最旧的cookie将被丢弃。一些浏览器还对他们将从所有网站接受的Cookie总数施加了绝对限制,通常为300个。2.cookie存储格式cookie可以包含一个主键,而主键又包含子项。例如,在ASP.NET获取Cookies的格式是:复制代码如下:request。cookies密钥][子项]。tostring();其中密钥是主键,子密钥是与主键相关联的子密钥。(1)本地磁盘存储格式:复制代码如下: my.common . test cookie info PKI d=999 test value=aabbbcccddee localhost/1536 3059603968 30021392 2348960464 30021191 *其中PKI d=999 test value=aabbbcccddee是Cookies的值,由于子项=子值格式,包含子项。(2)Javascript中的Cookie格式JavaScript中给出的Cookie是字符串,通过document.cookies获取,字符的格式如下:my.common . subkey=PKI d=999 test value=aaabbcccddeee;SingleKey=SingleKeyValue上面的字符串包含两个Cookies,一个是不带子项的单键,另一个是My。Common.SubKey带有pkid和TextValue子密钥,这两个cookies传递“;”。分开。(3)Asp.Net cookie的格式与所有服务器端语言的格式相同。使用集合类在Asp中保存Cookies集合。Net:复制代码如下:公共密封类http cookie集合: nameobjectcollectionbase {.}通过HttpResquest和HttpResponse对象的Cookies属性,可以获取和写入当前页面的Cookies。3.cookie的内容编码格式cookie的值可以保存,但“;”除外。标点符号而不是。但是不能保存汉字。保存汉字时会出现乱码。因此,Cookies中的内容应该统一编码和解码。为了在浏览器端和服务器端进行解码和编码,应该统一使用UTF编码格式。主要是因为javascript中只能使用UTF编码格式。cookie的路径属性cookie的路径属性表示当前cookie可以在网站的路径下工作。例如,以下两个同名的cookie:(9502 . 163.com)。
允许两个名称相同但路径不同的Cookies。无论是服务器还是客户端,都应该先获取本页路径下的Cookies。也就是说,如果在/chapter10/,路径下的页面上得到testKey的Cookies值,只能得到testValue222222的值。5.cookie的过期时间如果保存cookie时未设置过期时间,cookie的过期时间为“当前浏览器进程有效”,即像Session一样关闭浏览器后消失。在ASP.NET,您还可以通过将HttpCookie对象的过期时间设置为日期时间来指定Cookie将在浏览器之后生效。最小值.(这句话很难得。它是在负责人和其他人的帮助下发现的。)如果设置了过期时间并且过期时间大于当前时间,将保存Cookies值。如果设置了到期时间,但该时间小于或等于当前时间,则清除Cookies值。6.cookie和会话有时我们忽略了cookie和会话之间的关系。但两者是分不开的。会话的唯一标识符:会话标识符通常保存在Cookies(或网址)中。对于Asp.Net来说,会话ID存储在Cookies中,键值为“ASP。NET_SessionId”,如图所示:。
由于cookies的存储数量有限,我们的系统在保存Cookies时一定要注意防止这个密钥Cookie被洗掉。这个cookie是在下面描述的最佳实践中专门处理的——以强对象方式保存cookie的代码。7.cookie加密设置cookie的属性时,有一个选项Secure来控制cookie的加密特性。真;如果Cookie是通过SSL连接传输(HTTPS);否则,假的。默认值为false。如果我们保存一个cookie并设置加密,我们就不能在非HTTPS页面中获取cookie,无论是通过使用javascript还是在服务器端。但是,这个Cookies的存在在本地还是可以看到的。8.cookie和Ajax如果Ajax请求访问服务器页面,服务器页面可以将cookie和Session写入用户的浏览器。4.Cookies最佳实践在了解了Cookies的相关知识后,下面提出了最佳的事件方法。包括客户端和服务器端。(1)存储在Asp.Net的Cookies通常,我们使用Request和Response对象直接操作Cookies:编写Cookies:复制代码如下:response。cookies ['k1']。值=' k1值';回应。cookies[' k2 '][' k2-1 ']=' k2-1 value ';回应。cookies . Add(new httpookie(' k3 ',' k3Value ');读取Cookies:复制代码如下: request[' k1 '];请求。Cookies['k1']。价值;请求。cookies[' k2 '][' k2-1 '];请求。Cookies。获取(0)。价值;注意Request['k1'],一个大家熟悉的获取get和post参数的方法,也可以获取Cookies的值!此外,上面的一些语句必须通过Value属性访问,而其他语句则不能。(2)在对象模式下保存cookie下面提供了一个工具类,可以在对象模式下将cookie作为一个整体保存。并且只有一个Cookies被占用,所有属性都存在于子项上。源代码:复制代码如下:///summary ///Cookies基类。需要保存Cookies的数据类就是从这个类派生的,这个类可以保存和读取Cookies中的强类型对象。/////summary///备注//2009 . 8 . 6 ziqiu.zhangcreated////remarks///example///suppose认为MyCookiesInfo是从Cookies中获取的对象:///code////Cookie info item=new Cookie info();//从那以后,new已经用Cookies构造了对象。/////code ///将对象保存在Cookies中:///code///Cookie info item=new Cookie info();///item.value=“测试值”;///项。setCooKies(' 1 ');//Cookies有效期为1天/////code////示例[系统。serializable]公共类cookie信息{#。region=====================construted Method================//Summary///constructor///Summary public cookie info(){ }。region=======================================//Summary///获取当前Cookies的过期时间/////返回。返回公共日期时间getexpiretime(){ string cookieName=GetType()。ToString();if (HttpContext。当前. request . cookieName[cookieName]!=null) {返回HttpContext。当前. request . cookieName。过期;}返回DateTime。MinValue} ///摘要///保存Cookies。如果到期时间是浏览器关闭时,它们将变得无效。////summary////param name=' expire ntime ' cookies expired event/param///returns是否保存成功/returns public boolssave(){ return this。save(datetime . min value);} ///摘要///要保存Cookies,需要指定过期时间。
////摘要///param name='过期时间' Cookies过期事件/param /返回是否保存成功/返回公共bool Save(DateTime expiretime){ string Cookiename=GetType().ToString();httpookie session cookie=null//对SessionId进行备份if (HttpContext .当前。请求饼干ASP .NET_SessionId']!=null){字符串会话id=HttpContext .当前。请求饼干ASP . NET _ session id ']。价值。tostring();会话ookie=新的Httpcookie(' ASP . NET _ session id ');会话目录.value=session id }//设定甜饼干过期时间DateTime dtexpire=expiretimehttpcontext .当前。响应cookie[CookieName].expires=dtexpires//设定甜饼干域名。字符串域=字符串。空的;if (HttpContext .当前。请求。Params['HTTP_HOST']!=null){//域='www。艺龙。com ';domain=HttpContext .当前参数. ToString();} //如果是www.elong.com或多级域名,需要转化为elong.com如果(域. IndexOf(' .)-1) { string[] temp=domain .拆分('。');如果(温度。长度=3) {域=温度[温度.长度- 2]。Trim().温度[温度。长度- 1]。trim();} HttpContext .当前。响应cookie[CookieName].Domain=domain} //把类的属性,写入饼干。属性信息[]属性=获取类型()。GetProperties();foreach(PrOperty s中的属性信息(pi){对象OJ=pi .GetValue(这个,null);Type type=pi .PropertyType字符串值字符串=字符串。空的;如果(oj!=空oj .ToString()!=字符串。空){如果(类型==类型获取类型(系统.DateTime '){ value str=((DateTime)OJ).ToString(' yyyy/MM/DD hh :MM :s ',系统全球化。datetimeformatinfo。invaliant信息);} else { valueStr=oj .ToString();} HttpContext .当前。回应。烹饪名.名称]=Httputity .UrlEncode(ValueStr);} } //如果甜饼干总数超过20 个,重写ASP .NET_SessionId,以防会议丢失if (HttpContext .当前。请求。饼干。计数20会话ookie!=null) { if (SessionCookie .价值!=字符串。空){ HttpContext .当前。响应饼干.删除(' ASP . NET _ session id ');HttpContext .当前。回应。饼干。添加(会话cookie);} }返回true }////摘要///找回饼干值////汇总公共void Load(){ string cookieValue=string .空的;字符串CookieName=GetType().ToString();//通过遍历属性,从甜饼干中找回值,回写到属性。属性信息[]属性=获取类型()。GetProperties();foreach属性中的属性信息pi){ try { cookieValue=Httputity .UrlDecode(HttpContext .当前。请求。烹饪名.姓名]。ToString());} catch { cookieValue=string .空的;} if (pi .CanWrite cookieValue!=null cookieValue!=字符串。空){ try { object OBB=CookieValueType type=pi .PropertyTypeobb=转换ChangeType(obb,type);pi .SetValue(this,obb,null);} catch { } } } } # endregion }使用首先说明如何使用此类。为想要保存在饼干中的类建立模型,并且继承自CookieInfo即可。比如下面建立了MyCookieInfo类,其中包含属性pkid,TestValue和测试日期时间:复制代码代码如下:///summary ///保存饼干的数据对象////总结[系统可序列化]公共类mykokieinfo : CookieInfo { private int m _ Pkid=0;public int Pkid { get { return m _ Pkid;}设置{ m_Pkid=值;} }私有字符串m _ TestValue=公共字符串test value { get { return m _ TestValue;}设置{ m _ TestValue=value} }私有日期时间m _ TestDateTime=日期时间.现在;公共DateTime TestDateTime { get { return m _ TestDateTime;}设置{ m_TestDateTime=值;} } }接下来就可以使用对象的救援和负荷方法保存和读取Cookies:复制代码代码如下:•保存救援方法有两个重载,不带参数的救援方法表示饼干的过期时间与浏览器相同,即浏览器关闭则饼干消失。否则需要传入饼干过期时间。
mykokieinfo TestCooKies=new mykokieinfo();testCookies .PKI d=1;testCookies .' TestValue='中文测试;testCookies .save();•读取mykokieinfo TestCooKies=new mykokieinfo();testCookies .load();这个。lblmsg。text=' Pkid : ' TestCooKies .PKI d . ToString();this.lblMsg.Text=',TestValue:' testCookies .TestValue。ToString();this.lblMsg.Text=',TestDateTime:' testCookies .TestDateTime。ToString(' yyyy/MM/DD hh :MM :s ',系统全球化。datetimeformatinfo。invaliant信息);现在我们已经可以将一个强类型的对象读取和保存饼干了。 (3)使用爪哇岛描述语言操作饼干在客户端我们同样需要操作饼干。下面是封装了的专门用于操作饼干的jQuery工具函数。当然此工具函数稍加修改,就可以变成标准的爪哇岛描述语言函数。下载地址工具函数说明:方法签名:jQuery.cookie(名称、子名称、值、选项)方法说明:读取、写入、删除饼干方法参数:名称说明举例名称名称namecookies的主键值读取主键: $.cookie('singleKey ')写入饼干,值为字符串: $.cookie(“‘单键’,”,“‘单键-值’,{ expires: 1,path: '/',secure: false }) subName子键名称。在写入时请传递空或者空读取子键: $.cookie('multiKey ',' subName1 ')写入饼干,值为对象:var subname obj={ subname 1: ' AAA ',subName2: 'bbb ',subname 3: ' CCC ' };$.cookie('multiKey ','',subNameObj,{ expires: 1,path: '/',secure : false });valueCookies值,可以是字符串或者对象。如果是对象,则将对象的每个属性保存在饼干子键。参见上面实例选项。参数:过期时间:可以是数字或者数据类型的对象。如果传入数字表示几天后过期路径:路径,默认为域名根目录("/")。安全:是否启用加密,默认为否。指定过期时间:var myDate=new Date();myDate.setFullYear(2009,10,10);$.cookie("^单一key",""、"^单一键值",{ expires: myDate,secure: false }) 1天后过期:var time=Date();$.cookie(“‘单键’,”,‘单键-值’,{ expires: 1,path:',secure: false })
版权声明:深刻理解Cookies的方方面面(基础/高级)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。