{T}

Cookie 和 Session

作为一名 Java 工程师,理解 Cookie 和 Session 的概念和使用方法是非常重要的。以下是对这两个概念的详细讲解:

Cookie 是存储在客户端(通常是浏览器)上的小数据片段。它们由服务器发送,并在后续请求中被客户端发送回服务器。Cookie 通常用于存储用户偏好、会话标识符以及其他需要跨多个请求持久化的信息

  • 存储位置:客户端(浏览器)
  • 数据大小:每个 Cookie 大小通常不超过 4KB
  • 生命周期:可以设置过期时间(maxAge),过期后浏览器会自动删除
  • 安全性:数据存储在客户端,容易被用户查看和篡改,敏感信息不应存储在 Cookie 中

在 Java Web 应用中,可以使用 javax.servlet.http.Cookie 类来创建和管理 Cookie

创建和发送 Cookie:

java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

public void addCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("username", "john_doe");
    cookie.setMaxAge(24 * 60 * 60); // 设置 Cookie 有效期为一天
    response.addCookie(cookie);
}

读取 Cookie:

java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public String getCookieValue(HttpServletRequest request, String name) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(name)) {
                return cookie.getValue();
            }
        }
    }
    return null;
}

Session

Session 是一种在服务器端保持用户状态的方法。Session 通常与特定用户相关联,使用唯一的会话 ID(通常存储在 Cookie 中)来识别用户。Session 数据存储在服务器上,可以包含用户的登录状态、购物车信息等

  • 存储位置:服务器
  • 数据大小:没有固定限制,但应避免存储过多数据,影响性能
  • 生命周期:服务器端设置,通常会有默认的超时时间(例如 30 分钟),超时后会自动失效
  • 安全性:数据存储在服务器端,相对更安全

在 Java Web 应用中,可以使用 javax.servlet.http.HttpSession 类来创建和管理 Session

创建和存储数据到 Session:

java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public void createSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    session.setAttribute("username", "john_doe");
    session.setMaxInactiveInterval(30 * 60); // 设置 Session 过期时间为30分钟
}

读取 Session 数据:

java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public String getSessionValue(HttpServletRequest request, String name) {
    HttpSession session = request.getSession(false);
    if (session != null) {
        return (String) session.getAttribute(name);
    }
    return null;
}

销毁 Session:

java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public void invalidateSession(HttpServletRequest request) {
    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate();
    }
}

存储位置

  • Cookie:存储在客户端
  • Session:存储在服务器端

安全性

  • Cookie:容易被用户查看和篡改,安全性较低
  • Session:相对安全,因为数据存储在服务器端

数据大小

  • Cookie:每个 Cookie 大小有限制(通常不超过 4KB)
  • Session:没有固定限制,但应避免存储过多数据

生命周期

  • Cookie:可以设置过期时间,过期后自动删除
  • Session:服务器端设置过期时间,超时后失效

适用场景

  • Cookie:适用于存储不敏感的、需要跨多个请求持久化的数据,如用户偏好设置
  • Session:适用于存储敏感的、与用户会话相关的数据,如用户登录状态、购物车信息

版本差异(Cookie/Session → 现代 Web)

特性传统方案当前实践
会话存储服务端内存 Session分布式会话:Redis 存储(Spring Session Redis)
会话标识JSESSIONID Cookie不变;可配置 HttpOnly/Secure/SameSite 增强安全
单点登录自研OAuth2/OIDC、JWT(无状态)或 Spring Session + SSO
跨域会话需共享域SameSite=None + Secure + 三方 Cookie 受限,倾向 token 方案
集群扩展sticky session无状态 JWT 或 Redis 会话,天然水平扩展

Cookie/Session 基础机制不随版本变化;现代工程重点是会话外置(Redis)、安全属性(SameSite)与向无状态 JWT 演进的取舍。