之前已经详细介绍过了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中使用CookieSpring Boot框架为我们提供了操控Cookie的API——HttpServletResponse和HttpServletRequest对象,让我们轻松设置、读取和删除Cookie:
1.2.1 设置Cookie
代码语言:javascript复制@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复制@GetMapping("/getCookie")
public String getCookie(@CookieValue(value = "favoriteCoffee", defaultValue = "Latte") String coffee) {
// @CookieValue注解就像服务员读取会员卡信息
return "您最喜欢的咖啡是:" + coffee;
}1.2.3 删除Cookie
代码语言:javascript复制@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的应用场景 用户登录状态保持: 就像咖啡馆的会员卡,记住你的身份,下次光临无需再次登录。
个性化推荐: 根据你之前的选择,推荐你可能喜欢的咖啡和甜点。
购物车功能: 即使你中途离开了咖啡馆,购物车里的商品依然为你保留。
网站主题设置: 记住你喜欢的网站主题颜色、字体大小等,提供个性化浏览体验。
二、SessionSession,就像咖啡馆的专属会员档案,存储着你的详细信息、消费记录以及其他敏感信息。每次你光顾咖啡馆,服务员都会从档案柜中取出你的档案,为你提供个性化的服务。
2.1 Session 的工作原理 创建Session: 当用户第一次访问网站时,服务器会创建一个唯一的Session对象,就像为你在档案柜中建立一个专属档案。
生成Session ID: 服务器会为Session对象生成一个唯一的ID,并将其存储在Cookie中发送给浏览器,就像将档案的钥匙交给你保管。
发送Session ID: 浏览器每次请求都会带上Session ID,就像你每次光临咖啡馆都会出示会员卡。
识别用户身份: 服务器根据Session ID找到对应的Session对象,就像服务员根据会员卡找到你的档案,从而识别你的身份并获取相关信息。
2.2 Spring Boot中使用SessionSpring Boot框架为我们提供了操控Session的注解——@SessionAttributes 和 @ModelAttribute 注解,让我们像使用保险箱一样安全地存储和访问Session数据:
2.2.1 将数据存入Session
代码语言:javascript复制@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复制@GetMapping("/profile")
public String profile(@ModelAttribute("userInfo") User user) {
// 从Session中获取用户信息
return "欢迎回来," + user.getUsername() + "!";
}2.2.3 Session的过期时间:
代码语言:javascript复制// 在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的对比,希望对各位看官有所帮助,下期见,谢谢~