二者的区别简单说就是 Cookie 通过在客户端记录信息确定用户身份, Session 通过在服务器端记录信息确定用户身份.
关于 Cookie
Cookie 实际上是一小段的文本信息. 客户端请求服务器, 如果服务器需要记录该用户状态, 就使用 response 向客户端浏览器颁发一个 Cookie. 客户端会把 Cookie 保存起来.
当浏览器再请求该网站时, 浏览器把请求的网址连同该 Cookie 一同提交给服务器. 服务器检查该 Cookie, 以此来辨认用户状态. 服务器还可以根据需要修改 Cookie 的内容.
cookie 的内容
cookie 的内容主要包括: 名字, 值, 过期时间, 路径和域. 路径与域一起构成 cookie 的作用范围.
Name 和 Value 属性由程序设定, 默认值都是空引用.
Domain 属性的默认值为当前 URL 的域名部分, 不管发出这个 cookie 的页面在哪个目录下的.
Path 属性的默认值是根目录, 即 "/" , 不管发出这个 cookie 的页面在哪个目录下的. 可以由程序设置为一定的路径来进一步限制此 cookie 的作用范围.
Expires 属性, 这个属性设置此 Cookie 的过期日期和时间.
示例如下:
- HttpCookie cookie = new HttpCookie("MyCook");// 初使化并设置 Cookie 的名称
- DateTime dt = DateTime.Now;
- TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);// 过期时间为 1 分钟
- cookie.Expires = dt.Add(ts);// 设置过期时间
- cookie.Values.Add("userid", "value");
- cookie.Values.Add("userid2", "value2");
- Response.AppendCookie(cookie);
会话 Cookie 和持久 Cookie
若不设置过期时间, 则表示这个 cookie 的生命期为浏览器会话期间, 关闭浏览器窗口, cookie 就消失. 这种生命期为浏览器会话期的 cookie 被称为会话 cookie. 会话 cookie 一般不存储在硬盘上而是保存在内存里, 当然这种行为并不是规范规定的.
若设置了过期时间, 浏览器就会把 cookie 保存到硬盘上, 关闭后再次打开浏览器, 这些 cookie 仍然有效直到超过设定的过期时间. 存储在硬盘上的 cookie 可以在浏览器的不同进程间共享. 这种称为持久 Cookie.
Cookie 具有不可跨域名性
就是说, 浏览器访问百度不会带上谷歌的 cookie.
关于 Session
Session 是另一种记录客户状态的机制, 不同的是 Cookie 保存在客户端浏览器中, 而 Session 保存在服务器上. 客户端浏览器访问服务器的时候, 服务器把客户端信息以某种形式记录在服务器上. 这就是 Session. 客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了.
每个用户访问服务器都会建立一个 session, 那服务器是怎么标识用户的唯一身份呢? 事实上, 用户与服务器建立连接的同时, 服务器会自动为其分配一个 SessionId.
与 cookie 的联系
什么东西可以让你每次请求都把 SessionId 自动带到服务器呢? 显然就是 cookie 了, 如果你想为用户建立一次会话, 可以在用户授权成功时给他一个唯一的 cookie. 当一个用户提交了表单时, 浏览器会将用户的 SessionId 自动附加在 HTTP 头信息中,(这是浏览器的自动功能, 用户不会察觉到), 当服务器处理完这个表单后, 将结果返回给 SessionId 所对应的用户. 试想, 如果没有 SessionId, 当有两个用户同时进行注册时, 服务器怎样才能知道到底是哪个用户提交了哪个表单呢.
session 的创建
当程序需要为某个客户端的请求创建一个 session 时, 服务器首先检查这个客户端的请求里是否已包含了 sessionId, 如果已包含则说明以前已经为此客户端创建过 session, 服务器就按照 sessionId 把这个 session 检索出来使用(检索不到, 会新建一个), 如果客户端请求不包含 sessionId, 则为此客户端创建一个 session 并且生成一个与此 session 相关联的 sessionId,sessionId 的值是一个既不会重复, 又不容易被找到规律以仿造的字符串, 这个 sessionId 将被在本次响应中返回给客户端保存.
禁用 cookie 后如何使用 session
如果客户端禁用了 cookie, 通常有两种方法实现 session 而不依赖 cookie.
URL 重写, 就是把 sessionId 直接附加在 URL 路径的后面.
表单隐藏字段. 就是服务器会自动修改表单, 添加一个隐藏字段, 以便在表单提交时能够把 session id 传递回服务器.
Session 共享
对于多网站 (同一父域不同子域) 单服务器, 我们需要解决的就是来自不同网站之间 SessionId 的共享. 由于域名不同(aaa.test.com 和 bbb.test.com), 而 SessionId 又分别储存在各自的 cookie 中, 因此服务器会认为对于两个子站的访问, 是来自不同的会话. 解决的方法是通过修改 cookies 的域名为父域名达到 cookie 共享的目的, 从而实现 SessionId 的共享. 带来的弊端就是, 子站间的 cookie 信息也同时被共享了.
总结
cookie 数据存放在客户的浏览器上, session 数据放在服务器上.
cookie 不是很安全, 别人可以分析存放在本地的 cookie 并进行 cookie 欺骗, 考虑到安全应当使用 session.
session 会在一定时间内保存在服务器上. 当访问增多, 会比较占用你服务器的性能, 考虑到减轻服务器性能方面, 应当使用 cookie.
个 cookie 保存的数据不能超过 4K, 很多浏览器都限制一个站点最多保存 20 个 cookie.
可以考虑将登陆信息等重要信息存放为 session, 其他信息如果需要保留, 可以放在 cookie 中.
##################
来源: http://www.bubuko.com/infodetail-2939044.html