HttpSession 的运行原理

HttpSession 的运行原理(基于 Java Web)

HttpSession 是 Java Web 开发中用于在服务器端存储用户会话数据的机制,它的核心作用是跟踪用户状态(如登录信息、购物车数据等)。


1. HttpSession 的基本概念

  • 会话(Session):指用户从访问网站到关闭浏览器(或超时)期间的一系列交互过程。

  • Session ID服务器为每个会话分配的唯一标识符(通常是一个 JSESSIONID Cookie)。

  • 存储位置 :Session 数据默认存储在 服务器内存 中(Tomcat/Jetty等),也可以配置到 Redis、数据库等。


2. HttpSession 的工作流程

(1)创建 Session

当客户端(浏览器)第一次访问服务器时:

  1. 服务器检查请求是否携带 JSESSIONID Cookie。

  2. 如果没有,则创建一个新的 Session,并生成唯一的 JSESSIONID

  3. 服务器在响应头中返回 Set-Cookie: JSESSIONID=xxx,浏览器保存该 Cookie。

(2)后续请求携带 Session ID

浏览器在后续请求中会自动带上 JSESSIONID Cookie:

html 复制代码
GET /home HTTP/1.1
Cookie: JSESSIONID=abc123

服务器根据 JSESSIONID 找到对应的 Session,并读取/写入数据。

(3)相关配置

在一些前后端分离的项目中,涉及跨域问题,这时如果想让会话携带Cookie等凭证,那么需要配置: withCredentials: true。withCredentials可以控制请求是否携带Cookie等凭证,同样的后端也需要设置。

前端代码实例:

html 复制代码
fetch('http://api.example.com/login', {
  method: 'POST',
  credentials: 'include', // 等效于 withCredentials: true
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'user', password: 'pass' })
});

后端代码:

java 复制代码
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: <具体域名>  

注意前后端都需要配置,否则也会报错

(3)Session 失效

Session 会在以下情况被销毁:

  • 超时session.setMaxInactiveInterval(1800)(30分钟无活动则失效)。

  • 主动销毁 :调用 session.invalidate()

  • 服务器重启(如果 Session 未持久化到外部存储)。


3. HttpSession 的核心 API

方法 说明
request.getSession() 获取 Session(如果没有则创建)
request.getSession(false) 获取 Session(如果没有则返回 null
session.getId() 获取 Session ID
session.setAttribute("key", value) 存储数据
session.getAttribute("key") 读取数据
session.removeAttribute("key") 删除数据
session.invalidate() 销毁 Session
session.setMaxInactiveInterval(seconds) 设置超时时间(秒)

4. HttpSession 的底层实现

(1)Session 存储方式

  • 默认 :存储在 服务器内存 (Tomcat 使用 ConcurrentHashMap)。

  • 分布式环境 :使用 Redis数据库Session 复制(如 Spring Session)。

(2)Session ID 的传递方式

  • Cookie(默认)

    html 复制代码
    Set-Cookie: JSESSIONID=abc123; Path=/; HttpOnly
  • URL 重写(禁用 Cookie 时):

    html 复制代码
    <a href="/home;jsessionid=abc123">Home</a>

5. 代码示例

(1)存储 Session 数据

java 复制代码
@GetMapping("/login")
public String login(HttpServletRequest request) {
    HttpSession session = request.getSession(); // 获取或创建 Session
    session.setAttribute("user", "张三"); // 存储数据
    session.setMaxInactiveInterval(1800); // 设置30分钟超时
    return "登录成功";
}

(2)读取 Session 数据

java 复制代码
@GetMapping("/profile")
public String profile(HttpServletRequest request) {
    HttpSession session = request.getSession(false); // 不自动创建 Session
    if (session == null) {
        return "未登录";
    }
    String user = (String) session.getAttribute("user");
    return "当前用户: " + user;
}

(3)销毁 Session(退出登录)

java 复制代码
@GetMapping("/logout")
public String logout(HttpServletRequest request) {
    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate(); // 销毁 Session
    }
    return "已退出登录";
}

6. 常见问题

Session Cookie
存储位置 服务器 浏览器
安全性 较高(数据在服务端) 较低(可能被篡改)
存储大小 较大(依赖服务器内存) 较小(一般 ≤4KB)
生命周期 可设置超时时间 可设置过期时间

(2)如何防止 Session 劫持?

  • 使用 HTTPS 加密传输 JSESSIONID

  • 设置 HttpOnlySecure 标志,防止 XSS 攻击:

    java 复制代码
    // Spring Boot 配置(application.properties)
    server.servlet.session.cookie.http-only=true
    server.servlet.session.cookie.secure=true

7. 总结

  1. HttpSession 用于在服务器端存储用户会话数据 ,依赖 JSESSIONID 标识用户。

  2. 默认存储在内存,分布式环境可用 Redis 共享 Session。

  3. 核心操作setAttribute()getAttribute()invalidate()

  4. 安全建议 :使用 HttpOnly + Secure Cookie,避免 Session 劫持。

相关推荐
Zuckjet_15 分钟前
开启 3D 之旅 - 你的第一个 WebGL 三角形
前端·javascript·3d·webgl
2401_8638014621 分钟前
探索 12 种 3D 文件格式:综合指南
前端·3d
callJJ1 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
珍宝商店2 小时前
前端老旧项目全面性能优化指南与面试攻略
前端·面试·性能优化
bitbitDown2 小时前
四年前端分享给你的高效开发工具库
前端·javascript·vue.js
gnip3 小时前
实现AI对话光标跟随效果
前端·javascript
你的人类朋友3 小时前
JWT的组成
后端
脑花儿4 小时前
ABAP SMW0下载Excel模板并填充&&剪切板方式粘贴
java·前端·数据库
北风朝向4 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
canonical_entropy5 小时前
一份关于“可逆计算”的认知解码:从技术细节到哲学思辨的完整指南
后端·低代码·deepseek