Cookie与Session的认识与理解

一.引入这两种技术的原因

因为HTTP是无状态的协议,无法根据之前的状态继续处理后续的请求。也就是说在HTTP下,服务器无法分辨谁已经浏览过了某一网页,对于用户登录的情况,因为该协议无法记录登录状态,所以会导致每次跳转新的页面需要再次登录或者在每次的请求报文中添加参数来管理登陆状态。

虽然这种无状态的协议能够有效减少服务器cpu与内存的消耗,但是在某些情况下是非常不利于用户操作的,因此,为了能够让服务器记住用户的登陆状态以及了解用户购物车添加了哪些商品,先后出现了四种技术,分别是隐藏表单域、URL重写、cookie、session。

本文主要讨论的技术是cookie、session。

二者应用场景:

登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。

购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。

二.Cookie

Cookie通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤。更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。

<1>Cookie的处理流程:

  • 服务器向客户端发送cookie
  • 浏览器将cookie保存
  • 之后每次http请求浏览器都会将cookie发送给服务器端

<2>组成部分

Cookie的主要内容包括:名字,值,过期时间,路径和域。使用Fiddler抓包就可以看见。

  1. name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。
  2. value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码
  3. domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).
  4. path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
  5. expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
  6. max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。
  7. HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
  8. secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了

<3>浏览器进程间共享cookie

存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。

而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。

三.Session

Session存在服务器的一种用来存放用户数据的类HashTable结构。

浏览器第一次发送请求时,服务器自动生成了一HashTable和一Session ID来唯一标识这个HashTable,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

一般这个值会有个时间限制,超时后毁掉这个值,默认30分钟。

当用户在应用程序的 Web页间跳转时,存储在 Session 对象中的变量不会丢失而是在整个用户会话中一直存在下去。

Session的实现方式和Cookie有一定关系。建立一个连接就生成一个session id,打开几个页面就好几个了,这里就用到了Cookie,把session id存在Cookie中,每次访问的时候将Session id带过去就可以识别了.

四.Cookie与Session区别

<1>存储数据量方面:

session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象,且单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

<2>存储位置:

cookie存储在客户端,session存储在服务端。因Cookie在客户端所以可以编辑伪造,不是十分安全。

<3>资源限制:

Session过多时会消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端没问题。

<4>支持范围:

域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享。

猜你喜欢

转载自blog.csdn.net/u011795345/article/details/82950195