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

相关推荐
苏琢玉2 分钟前
从 Hexo 到 Astro:重构我的个人博客
前端·hexo
数据小馒头4 分钟前
浅谈SQL审核(一):SQL审核实现方式与常见工具的选择
后端
街尾杂货店&9 分钟前
webpack - 单独打包指定JS文件(因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改)
前端·javascript·webpack
月光技术杂谈11 分钟前
用Deepseek 实现一个基于web的扣图应用
前端·javascript·html5·ccs·tensorflow.js·canvas api
武子康34 分钟前
大数据-128 - Flink 并行度详解:从概念到最佳实践,一文读懂任务并行执行机制 代码示例与性能优化
大数据·后端·flink
小毛驴8501 小时前
在Spring Boot开发中,HEAD、OPTIONS和 TRACE这些HTTP方法各有其特定的应用场景和实现方式
spring boot·后端·http
金梦人生1 小时前
Css性能优化
前端·css
Holin_浩霖1 小时前
UI设计的底层逻辑:从组件到系统的跃迁
前端
Holin_浩霖1 小时前
前端开发者的 Web3 全图解实战 二
前端
写代码的皮筏艇1 小时前
CSS属性继承与特殊值
前端·css