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

相关推荐
方圆想当图灵7 分钟前
关于 Nacos 在 war 包部署应用关闭部分资源未释放的原因分析
后端
大模型真好玩12 分钟前
深入浅出LangChain AI Agent智能体开发教程(四)—LangChain记忆存储与多轮对话机器人搭建
前端·人工智能·python
Lemon程序馆18 分钟前
今天聊聊 Mysql 的那些“锁”事!
后端·mysql
龙卷风040520 分钟前
使用本地IDEA连接服务器远程构建部署Docker服务
后端·docker
vv安的浅唱24 分钟前
Golang基础笔记七之指针,值类型和引用类型
后端·go
陪我一起学编程36 分钟前
MySQL创建普通用户并为其分配相关权限的操作步骤
开发语言·数据库·后端·mysql·oracle
帅夫帅夫36 分钟前
深入理解 JWT:结构、原理与安全隐患全解析
前端
Struggler2811 小时前
google插件开发:如何开启特定标签页的sidePanel
前端
爱编程的喵1 小时前
深入理解JSX:从语法糖到React的魔法转换
前端·react.js