`HttpSession`与Cookie有什么关系呢?

欢喜 Servlet 发布时间:2025-05-28 10:12:05 阅读数:1884 1
下文笔者讲述httpsession和cookie之间的关系说明,如下所示

httpsession和cookie简介

`HttpSession`
   和
 `Cookie`是Java Web开发中用于"保持用户状态(会话跟踪)
    两个核心机制
	 它们之间有着千丝万缕的关系
	  但他们的作用不同

httpsession和cookie两者关系

关系 描述
HttpSession 依赖 Cookie 来保存会话 ID 默认情况下,服务器通过 Cookie 将 `JSESSIONID` 发送给浏览器,
用于标识用户的会话
Cookie 是客户端存储机制,HttpSession 是服务端存储机制Cookie 存在浏览器,
HttpSession 存在服务器内存或持久化存储中
两者共同实现会话跟踪浏览器第一次访问时创建 Session,
并通过Cookie保存`JSESSIONID`
后续请求携带该Cookie实现会话识别

HttpSession同Cookie对比

特性 `HttpSession` `Cookie` |
存储位置 服务器端(如 Tomcat 内存、Redis等) 客户端(浏览器)
安全性更高(数据不暴露给客户端)较低(可被篡改)
生命周期控制方式由服务器控制(超时或手动销毁)可设置过期时间(Max-Age / Expires)
容量限制无明确限制(取决于服务器内存)单个Cookie最大4KB,
每个域名最多20个Cookie
是否自动创建第一次调用`request.getSession()`时创建需要手动添加到响应中
是否支持跨域否(默认)可配置为支持跨域
是否适合敏感信息存储推荐不推荐
是否需要开启 Cookie 支持需要(否则无法识别 JSESSIONID)自身就是Cookie

HttpSession依赖Cookie的相关说明

1. 用户首次访问服务器:
   - 服务器调用 `request.getSession()` 创建一个 `HttpSession`
   - 服务器生成唯一的会话 ID(如 `JSESSIONID=ABC123`)
   - 服务器通过 **Set-Cookie 响应头** 把 `JSESSIONID` 发送给浏览器

2. 浏览器收到响应后:
   - 自动保存 `JSESSIONID` 到 Cookie 中
   - 后续每次请求都会带上这个 Cookie(包含 `JSESSIONID`)

3. 服务器收到请求后:
   - 根据 `JSESSIONID` 找到对应的 `HttpSession`
   - 实现用户状态保持(如登录状态、购物车等)

例:查看响应中的`JSESSIONID`

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        // 获取或创建 Session
        HttpSession session = request.getSession();

        // 输出 Session ID
        System.out.println("Session ID: " + session.getId());

        // 设置属性
        session.setAttribute("user", new User("Tom"));

        response.getWriter().println("登录成功");
    }
}

浏览器响应头中可以看到 
Set-Cookie: JSESSIONID=ABC123; Path=/myapp; HttpOnly

HttpSession与Cookie配合使用场景

场景 使用方式
登录状态保持 将用户信息保存在 `HttpSession`,浏览器通过 `JSESSIONID` 维护会话
购物车功能 将购物车对象保存在 `HttpSession` 中
记住我功能 使用 Cookie 持久化登录信息(如用户名)
多设备登录 结合 Cookie 和 Token 实现
分布式 Session 共享 使用 Redis、Spring Session + Cookie 中的 `JSESSIONID` 实现共享

例:URL重写(兼容无Cookie场景)

HttpSession session = request.getSession();
String url = "home";
String encodedUrl = response.encodeRedirectURL(url);
response.sendRedirect(encodedUrl); // 会变成 home;jsessionid=ABC123

session和cookie使用注意事项

 敏感信息建议存在Session中
   如:
     用户身份、权限等
 Cookie不适合存敏感信息
   如:
      密码、token应加密处理
 Session默认依赖Cookie
   若
      禁用 Cookie,需启用URL重写
 可结合Cookie实现“记住我”功能
   如
     保存用户名 
 可使用Redis替代默认Session存储
     实现分布式部署下Session共享
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/Servlet/202505/323.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者