HTTP 状态管理

Posted 小小小小小莹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 状态管理相关的知识,希望对你有一定的参考价值。

    之前分享的 HTTP 基础文章中提到过,HTTP 的特点中有一个是无状态,是指协议对事务处理没有记忆能力,在服务端不需要前面的信息时它的应答就较快,但是缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。为了解决这个缺陷提出了状态管理 Cookie 和 Session。


一、Cookie 机制

    Cookie 实际上是一小段的文本信息。客户端请求服务端,如果服务端需要记录该用户状态,就向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来,当浏览器再次请求该网站时,把请求的网址连同该 Cookie 一同提交给服务端。服务端检查该 Cookie 以此来辨认用户状态。


Cookie 工作原理

第一步:客户端第一次发起请求。

第二步:服务端通过 set-cookie 响应头把 cookie 发送给客户端,客户端读取 set-cookie 存储到 cookie 中。

第三步:客户端再次发起请求会把 cookie 带到服务端,服务端检查 cookie 返回响应结果。


二、Session 机制

    Session 是另一种记录客户状态的机制,保存在服务端。客户端浏览器访问服务端的时候,服务端把客户端信息以某种形式记录在服务端。客户端浏览器再次访问时只需要从该 Session 中查找客户的状态就可以了。


Session 工作原理

HTTP 状态管理

    首次访问会为该用户创建 SessionID 和 Session 缓冲区,再次访问 Cookie 携带 SessionID 表示用户的标识从缓冲区中查找信息。


Session 有效期

    由于有越来越多的用户访问服务端,因此 Session 也会越来越多。为防止内存溢出,服务端会把长时间没有活跃的 Session 从内存中删除。

    可通过如下手段控制 Session 的有效期:

  • 设置 Session 超时时间

  • 程序调用 HttpSession.invalidate()

  • 服务端进程被停止


三、Cookie 与 Session 的对比

存放位置不同

    Cookie 存储在客户端,Session 存储在服务端。

安全性(隐私策略)的不同

    Cookie 存储在客户端浏览器中,可能会产生伪装等安全问题,所以尽量不要用 Cookie 来存储敏感信息,或者采取加密的方法,而 Session 存储在服务端,不存在敏感信息泄露的风险。

有效期上的不同

    将 Cookie 的过期时间设为一个很大的值就可以实现永久记录信息,而 SessionID 可能会依赖 Cookie,如果过期时间太短 Session 会很快失效,而过期时间太长会使得服务器端累积大量的 Session 导致内存溢出。

对服务器压力的不同

    Session 存储在服务端,服务端为每个用户生成一个 Session。如果有很多并发用户,将会产生大量的 Session 并消耗大量内存。而 Cookie 存储在客户端,不消耗服务器资源。


四、LocalStorage 和 SessionStorage

    上面提到了 Cookie 和 Session 就不得不再说一下 LocalStorage 和 SessionStorage,后两者和前两者(主要是 Cookie)的关联在客户端都具有存储功能,Cookie 最主要的功能用于存储用户身份信息,而 LocalStorage 和 SessionStorage 可用于存储页面信息、不常修改的资源文件内容。

    下面3张图片分别是百度的 LocalStorage 和 Cookie 截图,首次访问页面从服务端加载资源文件(不常修改或首屏资源)后保存在浏览器的 LocalStorage 中,再次访问页面从缓存中拿取数据,可以减少资源请求导致页面留白问题。

HTTP 状态管理

以上是关于HTTP 状态管理的主要内容,如果未能解决你的问题,请参考以下文章

vue的接口封装和状态管理

Cookie或将被替换!Chrome工程师提议新型HTTP状态管理协议

HTTP会话的使用与管理

JSP-JSP状态管理

Jsp——状态管理

JavaWeb学习笔记-11状态管理