Cookie vs Session

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中使用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的对比,希望对各位看官有所帮助,下期见,谢谢~

💫 相关推荐

临研干货 | CRA如何进行中心首例筛选访视
365比分网

临研干货 | CRA如何进行中心首例筛选访视

📅 08-14 👀 3569
闪烁之光渠道服开区表一览,快来看看新服何时开启!
正规365网址是多少

闪烁之光渠道服开区表一览,快来看看新服何时开启!

📅 09-27 👀 4337
心理漫画:人为什么要努力?这是我见过的最好的答案
beat365在线平台网址

心理漫画:人为什么要努力?这是我见过的最好的答案

📅 11-26 👀 7451
刘燕铭包了孙俪多久
正规365网址是多少

刘燕铭包了孙俪多久

📅 08-01 👀 7134
1T的移动硬盘进行全盘搜索已丢失分区(重建分区表),按柱面搜,需要多长时间?
扎克 - 英雄联盟WIKI
正规365网址是多少

扎克 - 英雄联盟WIKI

📅 07-14 👀 1843
新手烤面包
正规365网址是多少

新手烤面包

📅 07-15 👀 6976
丰田锐志老款
beat365在线平台网址

丰田锐志老款

📅 08-04 👀 3261
三星s6android7.0root,三星S6 root教程_三星GALAXY S6获取root权限的方法