Cookie,Session 和缓存

2019-07-31  本文已影响0人  养乐多__

一、Cookie

  1. Cookie
    1. 服务器通过 Set-Cookie 头给客户端一串字符串
    2. 客户端每次访问相同域名的网页时,必须带上这段字符串
    3. 客户端要在一段时间内保存这个 Cookie
    4. Cookie 默认在用户关闭页面后就失效,后台代码可以任意设置 Cookie 的过期时间
    5. 大小大概在 4kb 以内

  2. Cookie 如何设置过期时间?
    如何删除 Cookie?

document.cookie = "name=cookie; max-age=60"
// 或
var currDate = new Date()
currDate.setTime(currDate.getTime()+60*1000) 
document.cookie = "name=cookie; expires=" + currDate.toGMTString()
document.cookie="name=cookie; max-age=0"
// 或
document.cookie="name=cookie; max-age=-1"
  1. Cookie 存在的问题
    用户可以随意篡改 Cookie;可以用 Session 来解决这个问题。

  2. 建议:前端永远不要去读 / 写 Cookie。

二、Session

  1. Session
    1. 将 SessionID(随机数)通过 Cookie 发给客户端
    2. 客户端访问服务器时,服务器读取 SessionID
    3. 服务器有一块内存(哈希表)保存了所有 session
    4. 通过 SessionID 我们可以得到对应用户的隐私信息,如 id、email
    5. 这块内存(哈希表)就是服务器上的所有 session

服务器通过 cookie 给用户一个 sessionID(随机数),sessionID 对应服务器里面的一小块内存,每次用户访问服务器时,服务器就通过 sessionID 去读取对应的 session,然后知道用户的隐私信息。

  1. Session 也可以用 【LocalStorage + 查询参数】实现(不基于 Cookie 实现)。

三、LocalStorage

  1. LocalStorage 是 html5 提供的 API,它是浏览器里的 hash 表,特点如下:
    1. LocalStorage 跟 HTTP 无关
    2. HTTP 不会带上 LocalStorage 的值
    3. 只有相同域名的页面才能互相读取 LocalStorage(没有同源那么严格)
    4. 每个域名的 localStorage 最大存储量为 5Mb 左右(每个浏览器不一样)
    5. 常用场景:记录有没有提示过用户(没有用的信息,不能记录密码)
    6. LocalStorage 永久有效,除非用户清理缓(持久化存储)
    7. LocalStorage 常用于 跨页面的存储持久化存储
  2. 属性

查看位置:开发者工具 —— Application —— Local Storage

四、SessionStorage(会话存储)

  1. SessionStorage
    1、2、3、4 同上
    5. SessionStorage 在用户关闭页面(会话结束)后就失效。

  2. SessionStorage 与 Session 没有关系。

五、HTTP 缓存控制

1. Cache-Control

  1. 功能
    Cache-Control 可以让浏览器在一段事件内不发请求,直接用本地的硬盘或内存作为响应,这样速度会极快。

  2. 用法
    网页文件过大(如 js 和 css 文件)时请求时间会比较长,可以用 Cache-Control 对 Web 进行性能优化:
    response.setHeader('Cache-Control', 'max-age=30')
    即 30 秒内同样的 URL 不再重新发送请求,直接从内存里获取。

  3. 为什么首页不能设置 Cache-Control ?
    这段时间内如果页面更新了,用户没有办法获取到页面的最新版本。
    所以首页不要设置缓存,尤其是 html 页面。

  4. 文件更新
    Cache-Control 在实际使用中一般把时间设置的长一些,比如 10 年。
    如果期间这些文件有更新,只需要在入口处(html)的文件路径中加查询参数(改变 URL)即可:<link rel="stylesheet" href="./css/default.css?v=2">
    <script src="./js/main.js?v=3></script>,浏览器就不再使用之前的缓存。

2. Expire

  1. Expires 设置过期时间点,例:
    response.setHeader('Expires', 'Fri, 05 Jul 2019 04:47:35 GMT')
    响应头中会出现 Expires 和时间,即在此日期之后,响应过期。
    例:Expires: Wed, 21 Oct 2015 07:28:00 GMT

  2. 如何获取当前时间
    let t = new Date() // 获取中国标准时间
    t.toGMTString() // 转为格林威治时间(世界时钟)

  3. 如果在 Cache-Control 响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。

3. ETag

  1. MD5
    MD5 是摘要算法,一般用于校验文件(nodejs 中有 MD5 的库)。

  2. ETag
    客户端初次发出请求时,服务器会在响应头中给出一个标记 ETag(由 MD5 生成),如:
    Etag: 440e570c372631aa20b9c778ad9e7273
    当等下次客户端发请求时会在请求头中带上这个 MD5:
    If-None-Match: 440e570c372631aa20b9c778ad9e7273
    服务器对比两次的 MD5,如果没有改变,则不需要下载,返回状态 304(Not Modified)。

4. last-modified

六、经典问答

  1. Session 与 Cookie 的关系
    一般来说,Session 是基于 Cookie 来实现的。
    (因为 session 必须将 sessionID 放在 Cookie 里发给客户端)

  2. Cookie 和 Session 的区别
    Cookie 保存在客户端,每次都随请求发送给服务器。
    Session 保存在服务器的内存里,其 Session ID 是通过 Cookie 发送给客户端的。

  3. Cookie 和 LocalStorage 的区别

  1. LocalStorage 和 SessionStorage 的区别
    LocalStorage 永久有效,除非用户清理缓存;
    SessionStorage 在用户关闭页面(会话结束)后就失效。

  2. Cache-Control 与 Expire 的区别
    Cache-Control 设置的是事件长度,Expire 设置的是时间点。
    如果客户端本地时间错乱,Expire 指令可能发挥不了作用,因此优先使用 Cache-Control。

  3. Cache-Control 与 ETag(304) 的区别
    Cache-Control 没有请求;
    ETag(304)有请求,有响应,但是响应没有第四部分(不下载)。

上一篇 下一篇

猜你喜欢

热点阅读