Session学习记录
session 概述
Session 是 Web 开发中用于在服务器端存储用户状态信息的机制,核心作用是解决 HTTP 协议 “无状态” 的特性带来的用户身份识别和状态维持问题
HTTP 协议的无状态:每次客户端与服务器的通信都是独立的,服务器无法天然记住 “这个客户端之前做过什么
session:服务器为每个客户端(用户)创建的专属存储空间,用于记录该用户的状态信息(如登录状态、权限、临时数据等)。服务器通过一个唯一标识(Session ID)来关联客户端和对应的存储空间。
Session 工作流程
- 客户端首次访问需要记录状态的服务时(登录,加入购物车),服务器生成一个唯一的 session ID 并在服务器本地创建于该 Session ID 绑定的存储空间,用于存放用户状态。服务器通过 HTTP 响应头,将 Session ID 发送给客户端
- 客户端存储接受到 cookie 后,将 Session ID 以 Cookie 形式存储在本地。
- 客户端后续请求携带 Session ID,用户再次访问服务器时,浏览器会检查本地的 Cookie,若存在与当前请求域名 / 路径匹配的 Session ID Cookie;浏览器会通过 HTTP 请求头 Cookie 将 Session ID 发送给服务器。
- 服务器收到请求后,从请求头中提取 session ID,根据 Session ID 查找对应的存储空间,若找到就更新用户状态,若未找到,就重新登录
session 的存储
- Session 数据存放在服务器进程的内存中,读写速度快,无需额外配置。服务器重启后,所有 Session 数据丢失;多服务器集群(负载均衡)时,Session 无法共享。
- 数据库存储:将 Session 数据存储在关系型数据库,用 Redis 存储 session。数据持久化,服务器重启后不丢失,支持分布式集群。相比内存存取,多了一次数据库 IO,性能略低
- 文件存储:基本不使用
session 存储在服务器端,且仅存储无意义的 session id,服务器也可以主动删除 session,安全性较高
session 的生命周期
- 服务器会为 session 设置超时时间,若用户在超时时间内没有新请求,服务器会删除 session ID。若有新请求,会重置超时时间。
- 用户退出登录,服务器可以调用 API 手动删除 Session
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Myskill-blog!