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 劫持。

相关推荐
Liu.7741 天前
vue3组件之间传输数据
前端·javascript·vue.js
|晴 天|1 天前
前端闭包:从概念到实战,解锁JavaScript高级技能
开发语言·前端·javascript
开发者小天1 天前
react的拖拽组件库dnd-kit
前端·react.js·前端框架
9号达人1 天前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户4445543654261 天前
在Android开发中阅读源码的指导思路
前端
用户54277848515401 天前
ESM 模块(ECMAScript Module)详解
前端
用户497357337981 天前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso1 天前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
全栈前端老曹1 天前
【ReactNative】核心组件与 JSX 语法
前端·javascript·react native·react.js·跨平台·jsx·移动端开发
用户54277848515401 天前
JavaScript 闭包详解:由浅入深掌握作用域与内存管理的艺术
前端