Cookie vs Session

之前已经详细介绍过了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

@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

@GetMapping("/getCookie")
public String getCookie(@CookieValue(value = "favoriteCoffee", defaultValue = "Latte") String coffee) {
    // @CookieValue注解就像服务员读取会员卡信息
    return "您最喜欢的咖啡是:" + coffee;
}

1.2.3 删除Cookie

@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

@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中获取数据

@GetMapping("/profile")
public String profile(@ModelAttribute("userInfo") User user) { 
    // 从Session中获取用户信息
    return "欢迎回来," + user.getUsername() + "!"; 
}

2.2.3 Session的过期时间:

// 在application.properties中配置Session过期时间,单位为秒
server.servlet.session.timeout=1800  // Session有效期为30分钟

2.3 Session 的应用场景
  • 用户登录状态管理: 将用户登录状态、权限信息等敏感数据存储在服务器端的Session中,就像将贵重物品存放在保险箱中一样安全可靠。

  • 购物车功能: 将用户的购物车信息存储在Session中,即使关闭浏览器,再次访问时购物车信息依然保留,就像咖啡馆为你保留未完成的订单一样贴心。

  • 防止表单重复提交: 提交表单后,生成一个唯一的token存储在Session中,用于判断是否重复提交,就像银行交易的安全令牌一样防止恶意操作。

三、Cookie vs Session

特性CookieSession
存储位置客户端(浏览器)服务器端
数据大小4KB无限制,但大量数据会增加服务器负担
生命周期可设置过期时间,默认会话级默认30分钟,可配置,用户长时间不操作或关闭浏览器后失效
安全性较低,信息容易被窃取或篡改较高,Session ID存储在服务器端
性能影响对服务器性能影响较小大量Session会占用服务器内存和CPU资源
应用场景存储少量非敏感数据,如用户ID、偏好设置等存储重要信息,如用户登录状态、购物车信息等

选择建议:

  • 安全第一: 对于安全性要求高的场景,例如用户登录信息、支付信息等,优先选择Session。

  • 数据为王: 对于需要存储大量数据的场景,例如购物车、用户行为轨迹等,选择Session更合适。

  • 性能优先: 对于性能要求高的场景,例如高并发网站,尽量减少Cookie的使用,或使用压缩技术,并优化Session的存储方式,例如使用Redis等缓存数据库。

总结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值