Java Web 应用程序中的会话管理

HTTP 是无状态的。这意味着来自浏览器的每个请求都是一次全新的交互。服务器不会记得你是谁,也不会记得你一秒钟前做了什么。

如果没有会话管理,网站将无法正常工作。

  • 你在每次点击页面时都需要重新登录。
  • 购物车会在每次操作后清空。
  • 个人设置会立即消失。

会话管理创造了连续性。它允许服务器将多个请求关联到同一个用户。

工作原理:

  1. 用户登录。
  2. 服务器创建一个会话。
  3. 服务器生成一个唯一的 Session ID。
  4. 服务器将此 ID 发送给浏览器。
  5. 浏览器在每次新请求时都会将该 ID 发回。

Java 使用 HttpSession 接口来处理这一点。你可以直接在会话中存储用户 ID 或角色等数据。

常见的追踪方法:

  • Cookies:最常用的方式。服务器发送一个 JSESSIONID cookie,浏览器处理其余部分。
  • URL 重写:将 ID 添加到 Web 地址中。如果用户禁用了 cookies,这种方式仍然有效。
  • 隐藏表单字段:ID 保存在 HTML 表单内部。

安全是最大的挑战。如果攻击者窃取了 Session ID,他们就可以冒充用户。

遵循以下规则以确保安全:

  • 使用 HttpOnly cookies 以防止 JavaScript 窃取。
  • 使用 Secure cookies,使数据仅通过 HTTPS 传输。
  • 使用 SameSite 设置来防止 CSRF 攻击。
  • 用户登出时,务必调用 session.invalidate()
  • 登录后创建新会话,以防止会话固定攻击 (fixation attacks)。

面向大型企业的扩展: 标准会话在单台服务器上运行良好。但大型应用在负载均衡器后面使用多台服务器。如果服务器 A 持有你的会话,服务器 B 将无法识别你。

为了解决这个问题,专业人士使用:

  • 粘性会话 (Sticky Sessions):负载均衡器每次都将你发送到同一台服务器。
  • 分布式缓存 (Distributed Caching):所有服务器都连接到像 Redis 这样的中央存储。这是行业标准。

现代应用还使用 JWT (JSON Web Tokens)。与会话不同,JWT 是无状态的。数据存在于令牌本身,而不是服务器上。这使得微服务的扩展变得更加容易。

精通会话管理有助于你构建安全且专业的 Java 应用程序。

Source: https://dev.to/naveenkumar1/session-management-in-java-web-applications-38od

Optional learning community: https://t.me/GyaanSetuAi