关于cookie:老生常谈Cookie与Session

38次阅读

共计 2629 个字符,预计需要花费 7 分钟才能阅读完成。

Session 简介
Session 是对于服务端来说的,客户端是没有 Session 一说的。Session 是服务器在和客户端建设连贯时增加客户端连贯标记,最终会在服务器软件(Apache、Tomcat、JBoss)转化为一个长期 Cookie 发送给给客户端,当客户端第一申请时服务器会查看是否携带了这个 Session(长期 Cookie),如果没有则会增加 Session,如果有就拿出这个 Session 来做相干操作

在这里援用他人家的一个小故事来加深印象:
咱们晓得,咱们用浏览器关上一个网页,用到的是 HTTP 协定,理解计算机的应该都晓得这个协定,它是无状态的,什么是无状态呢?就是说这一次申请和上一次申请是没有任何关系的,互不意识的,没有关联的。然而这种无状态的的益处是疾速。所以就会带来一个问题就是,我心愿几个申请的页面要有关联,比方:我在 www.a.com/login.php 外面登陆了,我在 www.a.com/index.php 也心愿是登陆状态,然而,这是 2 个不同的页面,也就是 2 个不同的 HTTP 申请,这 2 个 HTTP 申请是无状态的,也就是无关联的,所以无奈单纯的在 index.php 中读取到它在 login.php 中曾经登陆了!

那咋搞呢?我不可能这 2 个页面我都去登陆一遍吧。或者用笨办法这 2 个页面都去查询数据库,如果有登陆状态,就判断是登陆的了。这种查询数据库的计划尽管可行,然而每次都要去查询数据库不是个事,会造成数据库的压力。

所以正是这种诉求,这个时候,一个新的客户端存储数据形式呈现了:cookie。cookie 是把大量的信息存储在用户本人的电脑上,它在一个域名下是一个全局的,只有设置它的存储门路在域名 www.a.com 下,那么当用户用浏览器拜访时,php 就能够从这个域名的任意页面读取 cookie 中的信息。所以就很好的解决了我在 www.a.com/login.php 页面登陆了,我也能够在 www.a.com/index.php 获取到这个登陆信息了。同时又不必重复去查询数据库。

尽管这种计划很不错,也很疾速不便,然而因为 cookie 是存在用户端,而且它自身存储的尺寸大小也无限,最要害是用户能够是可见的,并能够随便的批改,很不平安。那如何又要平安,又能够不便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。

所以 Session 就是在一次会话中解决 2 次 HTTP 的申请的关联,让它们产生分割,让 2 两个页面都能读取到找个这个全局的 session 信息。session 信息存在于服务器端,所以也就很好的解决了平安问题。

Cookie 简介

Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies), 一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies)

Cookie 应用限度: Cookie 必须在 HTML 文件的内容输入之前设置; 不同的浏览器对 Cookie 的解决不统一, 应用时肯定要思考; 客户端用户如果设置禁止 Cookie, 则 Cookie 不能建设. 并且在客户端,一个浏览器能创立的 Cookie 数量最多为 300 个,并且每个不能超过 4KB, 每个 Web 站点能设置的 Cookie 总数不能超过 20 个

咱们从一个 request 申请中来看看 cookie 和 session

  1. 客户端第一次发送一个 http 申请到服务器端时。request 会解析申请中携带的 jssesionid,用它去找到存在于利用中的 session,因为此时服务端没有生成过 jssesionid,那么就会调用 session 的创立办法,生成一个新的 jssessionid
  2. 服务器端承受客户端申请后,发送一个 http 响应到客户端,这个响应头中蕴含 Set-Cookie 头部,在该头部返回 jssesionid 的信息。
  3. 当客户端再次发送该 http 申请时,就会在 cookie 信息中携带该 jessionid


这是一次 http 申请中(http://localhost:8080/test1),蕴含的申请和响应信息,是对一个零碎的首次拜访。申请头中,蕴含的 Cookie 信息,并没有上文提到的 jsessionid, 那是因为这是对系统的首次拜访,零碎还没生成 session。然而拜访之后,零碎就会生成一个 session,而且,会在响应流中设置响应头 Set-Cookie,其值为 JESSIONID=xxx。这样浏览器对 localhost:8080 和 cookie 的分割就有了记忆


这是第二次申请 http://localhost:8080/test1, 浏览器会被动在申请头增加包含 jsessionid 的 cookie 信息

强调一下 cookie 中的两个重要属性:

  • domain 示意的是 cookie 所在的域,默认为申请的地址,如网址为 www.test.com/test/test.aspx,那么 domain 默认为 www.test.com。而跨域拜访,如域 A 为 t1.test.com,域 B 为 t2.test.com,那么在域 A 生产一个令域 A 和域 B 都能拜访的 cookie 就要将该 cookie 的 domain 设置为.test.com;如果要在域 A 生产一个令域 A 不能拜访而域 B 能拜访的 cookie 就要将该 cookie 的 domain 设置为 t2.test.com。
  • path 示意 cookie 所在的目录,默认为 /,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个 cookie1 的 path 为 /test/,cookie2 的 path 为 /test/cd/,那么 test 下的所有页面都能够拜访到 cookie1,而 /test/ 和 /test/dd/ 的子页面不能拜访 cookie2。这是因为 cookie 能让其 path 门路下的页面拜访。

最初一个小总结
1、cookie 数据寄存在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很平安,他人能够剖析寄存在本地的 cookie 并进行 cookie 坑骗, 思考到平安该当应用 session。
3、session 会在肯定工夫内保留在服务器上。当拜访增多,会比拟占用你服务器的性能, 思考到加重服务器性能方面,该当应用 cookie。
4、单个 cookie 保留的数据不能超过 4K,很多浏览器都限度一个站点最多保留 20 个 cookie。

正文完
 0