首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cookie vs Session

Cookie vs Session

作者头像
艾伦耶格尔
发布2025-08-28 14:40:03
发布2025-08-28 14:40:03
6100
代码可运行
举报
文章被收录于专栏:Java基础Java基础
运行总次数:0
代码可运行

之前已经详细介绍过了cookie 和 session 了,本文将两种会话技术做一个对比讲解!

回顾: cookie详解 session详解

一、Cookie

想象一下,当你第一次踏入一家精致的咖啡馆,热情的服务员递上一张精美的卡片,上面记录着你的名字、你最爱的咖啡口味、以及你上次光顾的时间。下次光临时,服务员只需扫一眼卡片,就能准确地叫出你的名字,为你奉上你钟爱的饮品,这就是Cookie的魅力。

1.1 Cookie的真实身份:HTTP头部的一段文本

别看Cookie的名字听起来很美味,其实它只是一段存储在浏览器中的小型文本数据,由键值对组成,随着HTTP请求在浏览器和服务器之间来回传递。让我们用一个表格揭开它神秘的面纱:

属性

说明

名称(Name)

Cookie的唯一标识,就像你的名字一样

值(Value)

存储的信息,可以是字符串、数字等,就像你喜欢的咖啡口味

过期时间(Expires)

Cookie的“保质期”,可以设置具体时间或会话结束时失效,就像会员卡的有效期

域(Domain)

Cookie生效的域名范围,就像咖啡馆的分店

路径(Path)

Cookie生效的URL路径,就像咖啡馆的特定区域

安全标志(Secure)

是否只能通过HTTPS协议传输,就像高级会员卡的安全芯片

HttpOnly

是否只能通过HTTP协议访问,防止跨站脚本攻击(XSS),就像防伪标识

1.2 Spring Boot中使用Cookie

Spring Boot框架为我们提供了操控Cookie的API——HttpServletResponse和HttpServletRequest对象,让我们轻松设置、读取和删除Cookie:

1.2.1 设置Cookie

代码语言:javascript
代码运行次数:0
运行
复制
@GetMapping("/setCookie")
public String setCookie(HttpServletResponse response) {
    // 1. 创建Cookie对象,就像准备一个空的饼干模具
    Cookie cookie = new Cookie("favoriteCoffee", "Cappuccino"); 

    // 2. 设置Cookie的属性,就像为饼干添加各种配料
    cookie.setPath("/"); // 所有路径都生效,就像整个咖啡馆都能使用会员卡
    cookie.setMaxAge(3600); // Cookie有效期为1小时,就像会员卡的有效时间

    // 3. 将Cookie添加到响应头,就像把烘焙好的饼干装盘
    response.addCookie(cookie); 

    return "Cookie已设置!";
}

1.2.2 读取Cookie

代码语言:javascript
代码运行次数:0
运行
复制
@GetMapping("/getCookie")
public String getCookie(@CookieValue(value = "favoriteCoffee", defaultValue = "Latte") String coffee) {
    // @CookieValue注解就像服务员读取会员卡信息
    return "您最喜欢的咖啡是:" + coffee;
}

1.2.3 删除Cookie

代码语言:javascript
代码运行次数:0
运行
复制
@GetMapping("/deleteCookie")
public String deleteCookie(HttpServletResponse response) {
    // 1. 创建一个同名Cookie,但设置过期时间为0
    Cookie cookie = new Cookie("favoriteCoffee", null);
    cookie.setMaxAge(0); 
    cookie.setPath("/"); 

    // 2. 将其添加到响应头,覆盖原来的Cookie
    response.addCookie(cookie);

    return "Cookie已删除!";
}
1.3 Cookie的应用场景
  • 用户登录状态保持: 就像咖啡馆的会员卡,记住你的身份,下次光临无需再次登录。
  • 个性化推荐: 根据你之前的选择,推荐你可能喜欢的咖啡和甜点。
  • 购物车功能: 即使你中途离开了咖啡馆,购物车里的商品依然为你保留。
  • 网站主题设置: 记住你喜欢的网站主题颜色、字体大小等,提供个性化浏览体验。
二、Session

Session,就像咖啡馆的专属会员档案,存储着你的详细信息、消费记录以及其他敏感信息。每次你光顾咖啡馆,服务员都会从档案柜中取出你的档案,为你提供个性化的服务。

2.1 Session 的工作原理
  1. 创建Session: 当用户第一次访问网站时,服务器会创建一个唯一的Session对象,就像为你在档案柜中建立一个专属档案。
  2. 生成Session ID: 服务器会为Session对象生成一个唯一的ID,并将其存储在Cookie中发送给浏览器,就像将档案的钥匙交给你保管。
  3. 发送Session ID: 浏览器每次请求都会带上Session ID,就像你每次光临咖啡馆都会出示会员卡。
  4. 识别用户身份: 服务器根据Session ID找到对应的Session对象,就像服务员根据会员卡找到你的档案,从而识别你的身份并获取相关信息。
2.2 Spring Boot中使用Session

Spring Boot框架为我们提供了操控Session的注解——@SessionAttributes 和 @ModelAttribute 注解,让我们像使用保险箱一样安全地存储和访问Session数据:

2.2.1 将数据存入Session

代码语言:javascript
代码运行次数:0
运行
复制
@Controller
@SessionAttributes("userInfo") // 将名为"userInfo"的Model属性存储到Session
public class UserController {

    @GetMapping("/login")
    public String login(@RequestParam String username, Model model) {
        // 模拟用户登录逻辑...
        User user = new User(username);

        // 将用户信息添加到Model中,Spring Boot会自动将其存储到Session
        model.addAttribute("userInfo", user); 

        return "redirect:/profile"; 
    }
}

2.2.2 从Session中获取数据

代码语言:javascript
代码运行次数:0
运行
复制
@GetMapping("/profile")
public String profile(@ModelAttribute("userInfo") User user) { 
    // 从Session中获取用户信息
    return "欢迎回来," + user.getUsername() + "!"; 
}

2.2.3 Session的过期时间:

代码语言:javascript
代码运行次数:0
运行
复制
// 在application.properties中配置Session过期时间,单位为秒
server.servlet.session.timeout=1800  // Session有效期为30分钟
2.3 Session 的应用场景
  • 用户登录状态管理: 将用户登录状态、权限信息等敏感数据存储在服务器端的Session中,就像将贵重物品存放在保险箱中一样安全可靠。
  • 购物车功能: 将用户的购物车信息存储在Session中,即使关闭浏览器,再次访问时购物车信息依然保留,就像咖啡馆为你保留未完成的订单一样贴心。
  • 防止表单重复提交: 提交表单后,生成一个唯一的token存储在Session中,用于判断是否重复提交,就像银行交易的安全令牌一样防止恶意操作。
三、Cookie vs Session

特性

Cookie

Session

存储位置

客户端(浏览器)

服务器端

数据大小

4KB

无限制,但大量数据会增加服务器负担

生命周期

可设置过期时间,默认会话级

默认30分钟,可配置,用户长时间不操作或关闭浏览器后失效

安全性

较低,信息容易被窃取或篡改

较高,Session ID存储在服务器端

性能影响

对服务器性能影响较小

大量Session会占用服务器内存和CPU资源

应用场景

存储少量非敏感数据,如用户ID、偏好设置等

存储重要信息,如用户登录状态、购物车信息等

选择建议:

  • 安全第一: 对于安全性要求高的场景,例如用户登录信息、支付信息等,优先选择Session。
  • 数据为王: 对于需要存储大量数据的场景,例如购物车、用户行为轨迹等,选择Session更合适。
  • 性能优先: 对于性能要求高的场景,例如高并发网站,尽量减少Cookie的使用,或使用压缩技术,并优化Session的存储方式,例如使用Redis等缓存数据库。
总结

Cookie和Session都是Web开发中不可或缺的状态管理工具,它们就像一对默契的搭档,一个负责记录用户的基本信息,一个负责守护用户的敏感数据。开发者需要根据具体的应用场景选择合适的方案,才能打造出安全、高效、用户体验俱佳的Web应用。

以上就是Cookie和Session的对比,希望对各位看官有所帮助,下期见,谢谢~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Cookie
    • 1.1 Cookie的真实身份:HTTP头部的一段文本
    • 1.2 Spring Boot中使用Cookie
    • 1.3 Cookie的应用场景
  • 二、Session
    • 2.1 Session 的工作原理
    • 2.2 Spring Boot中使用Session
    • 2.3 Session 的应用场景
  • 三、Cookie vs Session
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档