之前已经详细介绍过了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 的工作原理
-
创建Session: 当用户第一次访问网站时,服务器会创建一个唯一的Session对象,就像为你在档案柜中建立一个专属档案。
-
生成Session ID: 服务器会为Session对象生成一个唯一的ID,并将其存储在Cookie中发送给浏览器,就像将档案的钥匙交给你保管。
-
发送Session ID: 浏览器每次请求都会带上Session ID,就像你每次光临咖啡馆都会出示会员卡。
-
识别用户身份: 服务器根据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
特性 | Cookie | Session |
存储位置 | 客户端(浏览器) | 服务器端 |
数据大小 | 4KB | 无限制,但大量数据会增加服务器负担 |
生命周期 | 可设置过期时间,默认会话级 | 默认30分钟,可配置,用户长时间不操作或关闭浏览器后失效 |
安全性 | 较低,信息容易被窃取或篡改 | 较高,Session ID存储在服务器端 |
性能影响 | 对服务器性能影响较小 | 大量Session会占用服务器内存和CPU资源 |
应用场景 | 存储少量非敏感数据,如用户ID、偏好设置等 | 存储重要信息,如用户登录状态、购物车信息等 |
选择建议:
-
安全第一: 对于安全性要求高的场景,例如用户登录信息、支付信息等,优先选择Session。
-
数据为王: 对于需要存储大量数据的场景,例如购物车、用户行为轨迹等,选择Session更合适。
-
性能优先: 对于性能要求高的场景,例如高并发网站,尽量减少Cookie的使用,或使用压缩技术,并优化Session的存储方式,例如使用Redis等缓存数据库。
总结
Cookie和Session都是Web开发中不可或缺的状态管理工具,它们就像一对默契的搭档,一个负责记录用户的基本信息,一个负责守护用户的敏感数据。开发者需要根据具体的应用场景选择合适的方案,才能打造出安全、高效、用户体验俱佳的Web应用。
以上就是Cookie和Session的对比,希望对各位看官有所帮助,下期见,谢谢~