当前位置: 首页 > news >正文

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:

GET /home HTTP/1.1
Cookie: JSESSIONID=abc123

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

(3)相关配置

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

         前端代码实例:

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

       后端代码:

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(默认)

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

    <a href="/home;jsessionid=abc123">Home</a>

5. 代码示例

(1)存储 Session 数据

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

(2)读取 Session 数据

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

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

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

6. 常见问题

(1)Session 和 Cookie 的区别

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

(2)如何防止 Session 劫持?

  • 使用 HTTPS 加密传输 JSESSIONID

  • 设置 HttpOnly 和 Secure 标志,防止 XSS 攻击:

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

相关文章:

  • 2025-05-13 学习记录--Python-循环:while循环 + for循环 + 循环控制
  • Flannel vxlan模式的优缺点
  • 线性投影层---将输入特征从一个空间映射到另一个空间
  • 数据库数据清洗、预处理与质量监控、 数据质量的核心概念
  • AFFS2 的 `yaffs_ext_tags` 数据结构详解
  • LlamaIndex 第八篇 MilvusVectorStore
  • 学习黑客Windows 注册表编辑器详解
  • 无人机俯视风光摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • 漏桶算法的实际应用案例:数据库批量写入流量控制
  • 【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压
  • (顺序表、单链表、双链表)==>一篇解决!(Java版)
  • 网安学途—流量分析 attack.pcap
  • 豌豆 760 收录泛滥现象深度解析与应对策略
  • 常见排序算法及复杂度分析
  • 中国区adsense接收pin码,身份验证和地址验证指南
  • Linux:进程控制2
  • django扩展练习记录
  • 【工作记录】Kong Gateway入门篇之简介
  • 用AI制作黑神话悟空质感教程,3D西游记裸眼效果,西游人物跳出书本
  • 大数据——解决Matplotlib 字体不足问题(Linux\mac\windows)
  • 四部门:到2025年底,全国行政村5G通达率超过90%
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖
  • 普京提议无条件重启俄乌谈判,外交部:我们支持一切致力于和平的努力
  • 打击网络谣言、共建清朗家园,中国互联网联合辟谣平台2025年4月辟谣榜
  • 人民空军:网上出现的“运-20向外方运送物资”为不实消息
  • 竞彩湃|热刺、曼联一周双赛不易,勒沃库森能否欢送阿隆索