前后端 Session

Session,即会话,它是存储在服务端的 “一轮会话” 的信息。

一、什么是 Session ?

1. 抽象的 Session

Session 本身是一个抽象概念。

客户端与服务器之间一对一的交互被称为会话,进而衍生出会话状态,这便是 Session 的抽象概念。

2. 具体的 Session

可以这么理解具体的 Session:

服务器划分了一块块存储空间,它们可以用于存储信息,分别对应一个客户端和一个服务器之间的会话状态。

二、工作流程

  • 后端接收请求,获取请求中附带的 session_id
    • 如果请求中附带了 session_id
      • 当根据 session_id 可以找到对应 Session 时,正常处理请求
      • 当根据 session_id 无法找到对应 Session 时,创建新的 Session
    • 如果请求中不附带 session_id,创建新的 Session
  • 使用 Session 访问和保存会话中的信息

三、特点

  • 数据保存在服务器端
  • 可以在一次会话的多次请求间共享数据
  • 可以存储任意类型,任意大小的数据

四、session_id 的携带方式

  • 第一次获取 Session 后,通过响应头中的 set-cookie 让客户端存储 JSESSIONID 这一 Cookie

    1
    set-cookie: JSESSIONID = sessionID值
  • 浏览器接收该请求响应后会将 Cookie 存储在浏览器之中

  • 此后,客户端每次向服务器发送请求时,会将 JSESSIONID 附带在 Cookie 中

2. 隐藏的表单字段

可以在表单中增加一个隐藏的 input:

1
<input type="hidden" name="sessionid" value="sessionID值">

它将会随着表单提交被附带在 GET 或 POST 之中,发送至服务器,服务器根据该值寻找对应 Session 。

3. URL 重写

可以在 URL 末尾追加额外数据用于标识 session,服务器根据该值寻找对应 Session 。

例如,http://w3cschool.cc/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。

1
http://XXXX.XXX;sessionid=sessionID值

URL 重写法在浏览器不支持 Cookie 时也能够很好的标识每一个 Session

  • Session 存储在服务器端

    Cookie 存储在客户端

  • Session 没有数据大小限制

    Cookie 有数据大小限制

  • Session 没有数据类型限制

    Cookie 只能存储字符串

  • Session 数据存储在服务器端,相对安全

    Cookie 数据存储在客户端,相对不安全

参考