Cookie是Web服务器生成,向用户浏览器发送的一小段ASCII文本。当浏览器接收到后,会将其信息片段以“键-值”对的形式保存在某个目录下的文本文件中。以后每次向同一个服务器发送请求的时候,浏览器都会发送以前存储在本地的Cookie。浏览器和服务器通过HTTP协议进行通讯,Cookie便被保存在HTTP的请求部分(Set-Cookie)。
HTTP协议是无状态的,对于同一个浏览器发出的多个请求,服务器无法区分是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。cookie正是这样的一段随HTTP请求一起被传递的额外数据。
很多浏览器支持4KB的cookie大小限制。由于这一限制,最好用cookie来存储少量数据,或者存储用id之类的标识符。用户id随后便可用于标识用户,以及从数据库或其他数据源读取用户信息。浏览器还限制站点可以在用户计算机上存储的cookie数据量。很多浏览器只允许每个站点存储20个cookie,如果试图存储更多的cookie,则最旧的cookie便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的cookie总数做出绝对限制,通常是300个。
常见属性解释如下:
(1)、 domain:指定关联的服务器或域。值是域名,比如baidu.com。如果我们想让tieba.baidu.com可以访问wenku.baidu.com设置的cookie,可以把domain属性设置成baidu.com,并把path设置成"/"。
(2)、 path:指定与cookie关联的web页。值可以是一个目录,或者是一个路径。如果/news/index.html建立了一个cookie,那么在/news/目录里的所有页面,以及该目录下面任务子目录里的页面都可以访问。在指定路径的时候,凡是来自同一服务器,url里有相同路径的所有web页面都可以共享cookie。
(3)、 expires:指定cookie的生命期。具体的值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间,就必须使用这个属性当过了到期日期时,浏览器就可以删除cookie文件,没有任何影响。
(4)、 secure:指定cookie的值通过网络如何在用户和服务器之间传递。这个属性的值或者是“secure”,或者为空。缺省情况下,该属性为空,也就是使用不安全的http连接传递数据。如果一个cookie标记为secure,那么它与服务器之间就通过https或其他安全协议传递数据。不过这只能保证cookie与服务器之间的数据传输过程加密,而保存在本地的cookie文件并不加密。倘若你想让本地cookie也加密,得自己加密cookie信息才行。
Cookie工作原理
一般来说,Cookie通过HTTP Headers从服务器端返回到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且将它返回至服务器,从而完成浏览器的论证。
例如,我们创建了一个名字为jss的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header,这里假设访问者的注册名是“huanggang@gmail.com”,同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“jss”的Cookie赋值为“huanggang@gmail.com”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。
浏览器对于Web服务器应答包头中Cookie的操作步骤:
1. 从Web服务器的应答包头中提取所有的cookie。
2. 解析这些cookie的组成部分(名称,值,路径等等)。
3. 判定主机是否允许设置这些cookie。允许的话,则把这些Cookie存储在本地。
浏览器对Web服务器请求包头中所有的Cookie进行筛选的步骤:
1. 根据请求的URL和本地存储cookie的属性,判断那些Cookie能被发送给Web服务器。
2. 对于多个cookie,判定发送的顺序。
3. 把需要发送的Cookie加入到请求HTTP包头中一起发送。
Cookie操作控制
(1)、 java:java对cookie的操作比较简单,涉及到的类有Cookie(setPath/setMaxAge)、HttpServletRequest(getCookie),HttpServletResponse(addCookie)。
(2)、 cookie 是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制,而并不是JavaScript本身的性质。document.cookie="userId=10081; userName=linus";
Cookie优缺点
Cookie的优点:
(1)、保存用户登录状态。例如将用户id存储于一个cookie内,这样当用户下次访问该页面时就不需要重新登录了,现在很多论坛和社区都提供这样的功能。cookie还可以设置过期时间,当超过时间期限后,cookie就会自动消失。因此,系统往往可以提示用户保持登录状态的时间:常见选项有一个月、三个 月、一年等。
(2)、跟踪用户行为。例如一个天气预报网站,能够根据用户选择的地区显示当地的天气情况。如果每次都需要选择所在地是烦琐的 ,当利用了cookie后就会显得很人性化了,系统能够记住上一次访问的地区,当下次再打开该页面时,它就会自动显示上次用户所在地区的天气情况。因为一切都是在后台完成,所以这样的页面就像为某个用户所定制的一样,使用起来非常方便。
(3)、定制页面。如果网站提供了换肤或更换布局的功能,那么可以使用cookie来记录用 户的选项,例如:背景色、分辨率等。当 用户下次访问时,仍然可以保存上一次访问的界面风格。
Cookie的缺点:
(1)、每次HTTP请求都会带下去,导致服务器上行带宽成本高,用户的访问速度受到影响。
(2)、cookie安全性不够高,Cookie权限作用域过大会有很大的安全隐患。
使用注意事项
(1)、 去除不必要的cookie
(2)、 使cookie体积尽量小以减少对用户响应的影响,否则页面打开速度会非常慢
(3)、 注意在适应级别的域名(domain)上设置cookie以便使子域名不受影响
(4)、 设置合理过期时间。较早地Expire时间和不要过早去清除cookie,都会改善用户的响应时间
(5)、 静态页面分域名管理,尽量实现和支持无cookie的HTTP请求,提高访问速度
来源:http://blog.csdn.net/huanggang028/article/details/8066955