Cookie Session Cache

1.Session
1.1 原理

session 可以放在文件、 内存中或数据库都可以, 是以键值对的形式存储。 Session也是一种 key-value 的属性对。

当程序需要为某个客户端的请求创建一个 session 的时候, 服务器首先检查这个客户端的请求里是否已包含了一个 session 标识 - 称为 session_id, 如果已包含一个 session_id则说明以前已经为此客户端创建过 session, 服务器就按照 session_id 把这个 session 检索出来使用(如果检索不到, 可能会新建一个, 根据 getSession()方法的参数); 如果客户端请求不包含 session id, 则为此客户端创建一个 session 并且生成一个与此 session 相关联的 session_id, 这个 session_id 将被在本次响应中返回给客户端保存。[响应报文中多了一个Set-Cookie 字段]

1.2 客户端Session(客户端传递session_id的方式)

[1] 使用 Cookie 来保存, 这是最常见的方法, “记住我的登录状态” 功能的实现正是基于这种方式的。 服务器通过设置 Cookie 的方式将 session_id 发送到浏览器。 如果我们不设置过期时间, 那么这个 Cookie 将不存放在硬盘上, 当浏览器关闭的时候, Cookie 就消失了, 这个 Session ID 就丢失了。 如果我们设置这个时间, 那么这个 Cookie 会保存在客户端硬盘中, 即使浏览器关闭, 这个值仍然存在, 下次访问相应网站时, 同样会发送到服务器上。

[2] URL 重写, 就是把 session id 直接附加在 URL 路径的后面, 也就是像我们经常看到JSP 网站会有 aaa.jsp?JSESSIONID=*一样的。

[3] 在页面表单里面增加隐藏域, 这种方式实际上和第二种方式一样, 只不过前者通过GET 方式发送数据, 后者使用 POST 方式发送数据。 但是明显后者比较麻烦。

1.3 服务端session 何时被删除

session 在下列情况下被删除:
A. 程序调用 HttpSession.invalidate()
B. 距离上一次收到客户端发送的 session_id 时间间隔超过了 session 的最大有效时间
C. 服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的 session cookie 失效, 不会使服务器端的 session 对象失效。因此可以调用上述A方法使其失效。

2. Cookie 的机制
2.1 Cookie 的种类

1.以文件方式存在硬盘空间上的永久性的 cookie。持久 cookie 是指存放于客户端硬盘中的 cookie 信息(设置了一定的有效期限) , 当用户访问某网站时, 浏览器就会在本地硬盘上查找与该网站相关联的 cookie。 如果该 cookie 存在, 浏览器就将它与页面请求一起通过 HTTP 报头信息发送到您的站点, 然后在系统会比对 cookie 中各属性和值是否与存放在服务器端的信息一致, 并根据比对结果确定用户为“初访者”或者“老客户”。

2.停留在浏览器所占内存中的临时性的 cookie, 关闭 Internet Explorer 时即从计算机上删除。

2.2 Cookie 的有效期

Cookie 的 maxAge 决定着 Cookie 的有效期, 单位为秒。
如果 maxAge 属性为正数, 则表示该 Cookie 会在 maxAge 秒之后自动失效。 浏览器会将maxAge 为正数的 Cookie 持久化, 即写到对应的 Cookie 文件中。 无论客户关闭了浏览器还是电脑,只要还在 maxAge 秒之前,登录网站时该 Cookie 仍然有效。

如果 maxAge 为负数, 则表示该 Cookie 仅在本浏览器窗口以及本窗口打开的子窗口内有效, 关闭窗口后该 Cookie 即失效。 maxAge 为负数的 Cookie, 为临时性 Cookie, Cookie信息保存在浏览器内存中, 因此关闭浏览器该 Cookie 就消失了。 Cookie 默认的 maxAge值为–1。

如果 maxAge 为 0, 则表示删除该 Cookie。 Cookie 机制没有提供删除 Cookie 的方法,因此通过设置该 Cookie 即时失效实现删除 Cookie 的效果。 失效的 Cookie 会被浏览器从Cookie 文件或者内存中删除。

2.3 Cookie 的组成部分

Cookie 在 HTTP 的头部信息中。
标 准格 式: Set- Cookie: NAME=VALUE ; Expires=DATE ; Path=PATH ;
Domain=DOMAIN_NAME; SECURE;
举例说明: Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2
008 05:02:50 GMT; Path=/web;

Cookie 的内容主要包括: 名字, 值, 过期时间, 域和路径

3.Cookie 与Session 的区别

1、 cookie 数据存放在客户端用来记录用户信息的, session 数据放在服务器上。

2、 正是由于 Cookie 存储在客户端中, 对客户端是可见的, 客户端的一些程序可能会窥探、复制甚至修改 Cookie 中的内容。 而 Session 存储在服务器上, 对客户端是透明的, 不存在敏感信息泄露的危险。

如果选用 Cookie, 比较好的办法是, 敏感的信息如账号密码等尽量不要写到 Cookie中。 最好是像 Google、 Baidu 那样将 Cookie 信息加密, 提交到服务器后再进行解密, 保证 Cookie 中的信息只有自己能读得懂。 而如果选择 Session 就省事多了, 反正是放在服务器上, Session 里任何隐私都可以。

3、 Session 是保存在服务器端的, 每个用户都会产生一个 Session。 如果并发访问的用户非常多, 会产生非常多的 Session, 消耗大量的服务器内存。 因此像 Google、 Baidu、 Sina这样并发访问量极高的网站, 是不太可能使用 Session 来追踪客户会话的。而 Cookie 保存在客户端, 不占用服务器资源。 如果并发浏览的用户非常多, Cookie是很好的选择。 对于 Google、 Baidu、 Sina 来说, Cookie 也许是唯一的选择。

4. session 和 cache 的区别

Session 是单用户的会话状态。 当用户访问网站时, 产生一个 SESSIONID, 并存在于 COOKIES 中。 每次向服务器请求时, 发送这个 COOKIES , 再从服务器中检索是否有这个 SESSIONID 保存的数据。 而 cache 则是服务器端的缓存, 是所有用户都可以访问和共享的。 因为从 Cache 中读数据比较快, 所以有些系统(网站) 会把一些经常被使用的数据放到 Cache 里, 提高访问速度, 优化系统性能

如果有几千个 session, 怎么提高效率 。 当 session 访问量比较大的时候, 怎么解决?
把 session 放到 redis 或 memcache 等此类内存缓存中或着把 session 存储在 SSD硬盘上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值