知识卡片

三种会话状态存储方式的定义

结构图卡

内容

确认需要保存会话状态之后,存储位置大致分三种。客户会话状态:数据保存在客户端,Web应用里常见做法包括把数据编码进URL、用Cookie、把数据串行化成表单的隐藏域,或者在胖客户端里直接放进对象结构。服务器会话状态:最简单的形式是在各次请求之间直接把数据留在内存里;也可以做得更持久一些,把对象序列化后存到应用服务器的文件系统里,或存进某种共享数据源(比如一张以会话标识号为键、以序列化对象为值的简单数据库表)。数据库会话状态:同样存在服务器端,但做法不同——把会话数据拆解成多张表和多个字段,像存储真正的持久化数据那样存进数据库里。三者并不互斥,理论上可以混合使用来分别存储会话状态的不同部分,只是这样做通常会让”哪部分数据该用哪种方式”变得难以理清;即使主要采用客户会话状态以外的方式,也建议至少在客户端保留一个会话标识号,以便定位对应的服务器端或数据库中的会话数据。

结构图

flowchart TB
  A["会话状态存储方式"]
  A --> B["客户会话状态<br/>URL编码/Cookie/隐藏域/胖客户端对象"]
  A --> C["服务器会话状态<br/>内存/序列化对象存文件系统或共享数据源"]
  A --> D["数据库会话状态<br/>拆解成表和字段,当持久数据存"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第6章 会话状态"之"6.3 存储会话状态的方法"(源文件:_epub-src/OEBPS/Text/000044.html) - 结论依据:原文说明"客户会话状态,在客户端保存数据……使用Cookie,串行化数据使其成为Web表单中的某个隐藏域……服务器会话状态,可以很简单,在各次请求之间把数据放在内存里……数据库会话状态……这种方式把会话数据分解成多个表和域,并把它保存在数据库中",直接支撑本卡结构图。 - 原始内容:数据库会话状态,也是在服务器端存储的方式,但这种方式把会话数据分解成多个表和域,并把它保存在数据库中,就像你保存更持久的数据那样。