Cookie 与 Session 基础知识

1. cookie
存储用户个人信息 (用户名, 密码, sessionID 等), 个性化信息 (网站主页首选项等非重要信息)
一般大小限制在 4K 字节

1-1. cookie 的实现方式

1-1-1. 会话性质的 cookie
服务器向客户端发送的 cookie, 如果没有指定过期时间, cookie 将存放在浏览器进程内存中, 不会写入硬盘文件

1-1-2. 持久化的 cookie
服务器向客户端发送的 cookie, 如果指定了过期时间, 将会在客户端 (浏览器) 的临时文件夹下生成一个文件

1-2. cookie 的原理及流程

1-2-1. 服务器到客户端
当服务器端代码中写入 cookie (1-3-2) 时, 返回给客户端的 http 响应头中会加入 cookie 信息, 浏览器按照 http 响应头中的 cookie 信息在客户端建立 cookie

1-2-2. 客户端到服务器
每次请求, 客户端的 cookie 信息被放在 http 请求头中 (1-3-1) 发送到服务器端, 并且同一个域, 在客户端建立的所有 cookie (只要不过期), 在客户端的每一次 http 请求都会携带, 所以 cookie 在客户端的大小是有限制的

1-3. 与 cookie 相关的 http 头
1-3-1. cookie: 客户端将服务器设置的 cookie 返回到服务器
1-3-2. set-cookie: 服务器向客户端设置 cookie
1-3-3. cookie2 (RFC2965): 客户端指示服务器支持 cookie 的版本
1-3-4. set-cookie2 (RFC2965): 服务器向客户端设置 cookie


2. session
存储用户登录信息 (用户名, 权限信息等) 和少量的与用户相关的数据 (查询用的主键等)
对每个用户的登录都会创建 session, 尽量避免存储大数据, 以免过多的消耗服务器内存

2-1. session 的原理及流程
服务器端机制, 服务器使用类似于散列表的结构来保存所有的 session 信息
当有客户端请求时, 服务器首先检查请求里是否已包含 sessionID, 如果已包含则检索出相关 session 信息并使用, 如果不包含, 则创建一个 session 并且生成一个与此 session 相关联的 sessionID, 并在本次响应中返回给客户端

2-2. session 的实现方式

2-2-1. 利用会话 cookie 的 session
session 是 web 服务器利用会话 cookie 来实现的, cookie 里只存放了 SessionID
服务器上建立一张表, 对应客户端的 SessionID, 这张表是存放在服务器上的内存中, 当客户端请求服务器时, 如果服务器发现这是一个新的请求, 就会分配一个新的 SessionID, 在浏览器内存中写入一个 sessionID 的 cookie

2-2-2. 利用 URL 回写的 session
服务器在发送给浏览器页面的所有链接中都携带 sessionID 的参数, 这样客户端点击任何一个链接都会把sessionID 带会服务器. 如果直接在浏览器输入服务端资源的 url 来请求该资源, 那么 session 是匹配不到的.
tomcat 对 session 的实现, 是一开始同时使用 cookie 和 URL 回写机制, 如果发现客户端支持 cookie, 就继续使用 cookie, 停止使用 URL 回写, 如果发现 cookie 被禁用, 就一直使用URL回写, jsp开发处理到session 的时候, 对页面中的链接注意应该使用 response.encodeURL()

2-3. session 的结束

2-3-1. 利用 URL 回写的 session
服务器端可以清除一个 session 会话, 而客户端没有能力清除 session
关闭浏览器时并不能够结束当前的会话 (忽略浏览器关闭事件)
关闭浏览器后, 下次再访问同一页面时, 服务器会产生新的 session 对象和 sessionID, 但原来的 session 对象还继续保留在服务器
在利用 2-2-2 的方法时, 关闭浏览器次打开后手动替换原来的 url 中的 sessionID, 可以恢复之前的会话
当服务器主动释放 session 资源, 或 session 对象过期 (一段时间没有被使用), 则原来的 session 会被清除

2-3-2. 利用会话 cookie 的 session
利用 2-2-1 时, cookie 被存放在浏览器内存中, 所以一个浏览器的进程就会产生一个 session, 可以通过任务管理器查看进程
对于 ajax 请求, 确切的说是 xmlhttp 组件发送的 http 请求, 虽然是使用 js 的代码自己创建的, 但是依然是借助于浏览器发送的, 所以可以获得 session, 所以在 webservice 中使用 session 我们还得自己造一个东西实现 cookie 的功能


3. cookie 与 session 的不同点
3-1. cookie 保存在客户端, 减轻了服务器负担; session 保存在服务器端, 用户越多, 内存消耗越大
3-2. cookie 最早在 RFC2109 中实现, 后续 RFC2965 做了增强. session 并没有在 http 协议中定义
3-3. cookie 安全性差; session 安全性高
3-4. 过期时间, cookie 可以选择永久保存, session 一般设置较短时间

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22558114/viewspace-1122588/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22558114/viewspace-1122588/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值