cookie与session的对比
Web应用程序是使用HTTP
协议传输数据的。HTTP
协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。要跟踪该会话,必须引入一种状态保持机制。
状态保持
修改
Http
协议,使得它支持状态保持(难做到)Cookies
:通过客户端来保持状态信息Cookie
是服务器发给客户端的特殊信息Cookie
是以文本的方式保存在客户端,每次请求时都带上它
Session
:通过服务器端来保持状态信息Session
是服务器和客户端之间的一系列的交互动作- 服务器为每个客户端开辟内存空间,从而保持状态信息
- 由于需要客户端也要持有一个标识(
id
),因此,也要求服务器端和客户端传输该标识, - 标识(
id
)可以借助Cookie
机制或者其他的途径来保存
COOKIE
机制
Cookie
,有时也用其复数形式Cookies
,指某些网站为了辨别用户身份、进行session
跟踪而储存在用户本地终端上的数据(通常经过加密)。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie
是由服务器端生成,发送给User-Agent
(一般是浏览器),浏览器会将Cookie
的key/value
保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie
给服务器(前提是浏览器设置为启用cookie)。Cookie
名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookies
包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP
传输中的状态。
Cookie
是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息,如密码。
Cookie
具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie
,而不会携带Baidu的Cookie
。Google也只能操作Google的Cookie
,而不能操作Baidu的Cookie
。
基本特点
Cookie
以键值对Key-Value
形势进行信息的存储,只能保存字符串对象,不能保存对象类型Cookie
基于域名安全,不同域名的Cookie
是不能互相访问的Cookie
保存在客户端,需要客户端浏览器的支持,缺点:浏览器用户可能会禁用Cookie
SESSION
机制
如果说 Cookie
机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session
机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session
相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
每次客户端发送请求,服务端都检查是否含有sessionId
。
如果有,则根据sessionId
检索出session
并处理;如果没有,则创建一个session
,并绑定一个不重复的sessionId
。
基本特点
- 状态信息保存在服务器端。这意味着安全性更高,可以存储敏感、重要的信息,支持更多字节,缺点:
Session
共享问题 - 通过类似与
Hashtable
的数据结构来保存,能支持任何类型的对象(session
中可含有多个对象) - 保存会话id的技术,依赖于
Cookie
。默认情况下在客户端与服务器端之间通过cookie
方式传递SeesionId
总结
两种状态跟踪机制的比较
Cookie | Session | |
---|---|---|
存储位置 | 保持在客户端 | 保存在服务器端 |
存储类型 | 只能保持字符串对象 | 支持各种类型对象 |
实现机制 | 通过过期时间值区分Cookie 的类型 | 需要SeesionId 来维护与客户端的通信 |
会话Cookie ——负数表示关闭浏览器销毁Cookie | Cookie (默认) | |
普通Cookie ——正数是设置的销毁时间,单位是秒 | 表单隐藏字段 | |
不支持Cookie ——0表示立即销毁Cookie | *url *重写 |