首页 > 其他分享 >什么是Cookie与Session?(一文搞懂)

什么是Cookie与Session?(一文搞懂)

时间:2024-07-26 21:27:08浏览次数:11  
标签:浏览器 cart Session Cookie 服务器 搞懂 ID

在Web开发中,用户状态管理是一个重要的概念。由于HTTP协议的无状态性,每次请求都是独立的,这意味着服务器无法识别连续的请求是否来自同一用户。为了克服这一限制,Cookie和Session应运而生。本文将详细讲解Cookie和Session的概念、工作原理、优缺点以及它们的使用场景,并通过示例帮助理解。

一、Cookie

1.1 什么是Cookie

如果把一次网站访问比作一次旅程,那么Cookie就是旅途中你随身携带的一张身份卡片。这张卡片上记录了你的一些信息,每次你进入某个站点时,都会向站点展示这张卡片,站点就能“记住”你。

Cookie是存储在用户浏览器中的小数据片段,由服务器发送并由浏览器在后续请求中携带,帮助服务器识别用户。每个Cookie都是一个键值对,通常包含以下属性:

  • 名称:Cookie的名称
  • :Cookie的值
  • :Cookie适用的域
  • 路径:Cookie适用的路径
  • 过期时间:Cookie的有效期
  • 安全标志:指示Cookie是否仅通过HTTPS传输

1.2 Cookie的工作原理

  1. 服务器发送Cookie:用户首次访问网站时,服务器生成一个Cookie并通过HTTP响应头Set-Cookie发送给浏览器。
  2. 浏览器存储Cookie:浏览器接收到Cookie后将其存储。
  3. 浏览器发送Cookie:用户再次访问该网站时,浏览器会在HTTP请求头中携带相应的Cookie。
  4. 服务器读取Cookie:服务器读取Cookie并根据其内容识别用户。

1.3 Cookie示例

假设我们在一个电商网站上有一个用户偏好设置功能,可以通过Cookie来存储用户的语言偏好。

设置Cookie的响应头示例
Set-Cookie: language=en; Path=/; HttpOnly; Secure
浏览器请求时携带Cookie的请求头示例
Cookie: language=en

1.4 代码示例

设置Cookie的JavaScript代码
document.cookie = "language=en; path=/; Secure; HttpOnly";
读取Cookie的JavaScript代码
function getCookie(name) {
    let cookieArr = document.cookie.split(";");
    for (let i = 0; i < cookieArr.length; i++) {
        let cookiePair = cookieArr[i].split("=");
        if (name === cookiePair[0].trim()) {
            return decodeURIComponent(cookiePair[1]);
        }
    }
    return null;
}

// 获取语言偏好设置
let language = getCookie("language");
console.log("Preferred language: " + language);

1.5 Cookie的优缺点

优点
  • 轻量级:适用于存储少量数据。
  • 跨请求共享:可以在不同请求之间传递数据。
缺点
  • 安全性低:敏感信息易被窃取。
  • 容量限制:每个域名下的Cookie数量和大小有限。
  • 性能影响:请求中携带过多Cookie会影响性能。

二、Session

2.1 什么是Session

如果把访问网站比作住酒店,那么Session就像是你在前台登记入住后,得到的一张房卡。这张房卡是唯一的,你可以用它进出房间,前台也能通过这张卡片知道你住在哪个房间,并提供相应的服务。Session存储在服务器端,通过唯一的Session ID标识用户。Session ID通常存储在Cookie中,并在每次请求时发送给服务器,以便服务器识别用户并从Session中读取用户状态信息。

2.2 Session的工作原理

  1. 创建Session:用户首次访问网站时,服务器创建一个Session,并生成一个唯一的Session ID。
  2. 发送Session ID:服务器通过Set-Cookie响应头将Session ID发送给浏览器。
  3. 存储Session:服务器在内存或持久化存储中保存Session数据。
  4. 浏览器发送Session ID:用户再次访问网站时,浏览器在请求中携带Session ID。
  5. 服务器读取Session:服务器根据Session ID读取相应的Session数据。

2.3 Session示例

假设我们在一个电商网站上有一个购物车功能,可以通过Session来存储用户的购物车信息。

设置Session ID的响应头示例
Set-Cookie: JSESSIONID=xyz789; Path=/; HttpOnly; Secure
浏览器请求时携带Session ID的请求头示例
Cookie: JSESSIONID=xyz789

2.4 代码示例

创建和使用Session的Java代码(Spring Boot示例)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.ArrayList;

@RestController
public class ShoppingCartController {

    @GetMapping("/add-to-cart")
    public String addToCart(HttpSession session) {
        List<String> cart = (List<String>) session.getAttribute("cart");
        if (cart == null) {
            cart = new ArrayList<>();
            session.setAttribute("cart", cart);
        }
        cart.add("Item1");
        return "Item added to cart!";
    }

    @GetMapping("/view-cart")
    public List<String> viewCart(HttpSession session) {
        List<String> cart = (List<String>) session.getAttribute("cart");
        if (cart == null) {
            cart = new ArrayList<>();
        }
        return cart;
    }
}

2.5 Session的优缺点

优点
  • 安全性高:Session数据存储在服务器端,安全性较高。
  • 存储容量大:可以存储更多的数据,不受浏览器限制。
缺点
  • 占用服务器资源:大量用户会占用服务器内存或存储空间。
  • 依赖Cookie:需要通过Cookie或URL传递Session ID。

三、Cookie与Session的对比

方面CookieSession
存储位置客户端(浏览器)服务器
安全性较低,易被窃取较高,数据存储在服务器端
存储容量有限,每个Cookie大小限制约4KB较大,取决于服务器存储能力
性能影响请求中携带过多Cookie会影响性能占用服务器资源
生命周期可设置过期时间,长时间存储会话结束或超时失效
使用场景适合存储少量非敏感数据,如偏好设置适合存储用户状态、敏感数据

四、使用场景

4.1 Cookie的使用场景

  • 用户偏好设置:存储用户的语言、主题等偏好设置。
  • 跟踪用户行为:用于广告、分析用户行为等。

4.2 Session的使用场景

  • 用户认证:存储用户登录状态、权限等信息。
  • 购物车:在电商网站中存储用户的购物车信息。

标签:浏览器,cart,Session,Cookie,服务器,搞懂,ID
From: https://blog.csdn.net/weixin_63698171/article/details/140676508

相关文章

  • FlinkSQL窗口函数TUMBLE、SESSION 和 HOP的区别
    目录TUMBLE滚动窗口(TumblingWindow)SESSION会话窗口(SessionWindow)HOP滑动窗口(HoppingWindow)小结HOP窗口为什么不需要rowtime(事件时间) PROCTIME()vsrow_time 为什么HOP窗口常用PROCTIME()?总结TUMBLE、SESSION可以使用处理时间嘛TUMBLE窗口(滚动窗口)SESS......
  • 一文彻底搞懂浏览器事件机制、事件委托、事件冒泡、事件循环、Event Loop、react事件
    一、事件是什么?事件模型?事件是用户操作网页时发生的交互动作,比如click/move,事件除了用户触发的动作外,还可以是文档加载,窗口滚动和大小调整。事件被封装成一个event对象,包含了该事件发生时的所有相关信息(event的属性)以及可以对事件进行的操作(event的方法)。事件是用......
  • 【经典问题】精析:一文搞懂 动态规划解决 0-1背包问题
    背包问题核心元素:数量为n的物品,容量为size的背包,给出每个物品的重量weight和价值val,求背包能装的物品最大总价值。求解思路的本质:从小体量(少物品,少容量)的问题开始,不断求出局部最优解,然后以此为基础放大问题(求得较多物品,较大容量下最优解)重复上述过程,直到求出题目要求的最优......
  • 会话技术-Cookie&Session
    目录会话跟踪技术会话会话跟踪CookieCookie基本使用概念工作流程基本使用发送Cookie获取CookieCookie原理分析Cookie使用细节Cookie的存活时间Cookie存储中文SessionSession基本使用概念工作流程基本使用Session原理分析Session使用细节Session钝化与活......
  • 一文搞懂系列——PEM文件解析流程
    背景前几周,协助同事解决了SM2软签名的需求,其流程可参考终于解决了!!!基于GmSSL的SM2签名算法及思路分享。但是在解决这个问题的过程中,让我想起了一些不好的回忆:曾经在大众项目中,也接触过椭圆曲线算法签名。其中因为平台下发的公钥格式,由于双方理解不一致,导致最终调试很久,并......
  • 【Git-驯化】一文搞懂git中代码回测reset详细使用方法
    【Git-驯化】一文搞懂git中代码回测reset详细使用方法 本次修炼方法请往下查看......
  • Cookie - Web开发
    Cookie是存储在用户浏览器中的小型文本文件,用于在客户端和服务器之间传递信息。Cookie通常用于跟踪用户会话、存储用户偏好设置、记录用户行为等。Cookie是Web开发中常用的技术之一,用于增强用户体验和实现各种功能。Cookie的定义Cookie是由服务器发送给客户端的一段数据,客......
  • 我如何修复 cs50p Cookie jar 错误中的此错误
    该问题集涉及创建一个名为jar的类,并将其用作cookiejar,可以通过存款向其中添加cookie,然后通过取款删除cookie。当我运行它时,程序似乎按预期工作,但我似乎无法弄清楚为什么会出现此错误::(Jar的构造函数初始化具有给定容量的cookiejar预期退出代码0,而不是1import......
  • shiro中session的使用
    下图是shiro中session的存放使用逻辑使用shiro中的session的步骤一、创建SessionFactory的实现类,实现createSession方法@OverridepublicSessioncreateSession(SessionContextinitData){OnlineSessionsession=newOnlineSession();if(initData!=null&&initDatai......
  • 利用蓝莲花BlueLotus通过XSS获取Cookie
    蓝莲花BlueLotus_XSSReceiver清华大学蓝莲花战队做的一个平台,优点是足够小,不需要数据库,只要有个能运行php的环境就可以了,缺点是一般只适合一个人用。配置蓝莲花拉取dockerdockerpullromeoz/docker-apache-php:5.6上传文件文件下载地址:https://github.com/trysec/......