cookie 与 session -- 会话管理

目录

前言 -- HTTP的无状态

概念

工作原理

Cookie 分类

会话 Cookie -- 内存级存储

持久 Cookie -- 文件级存储

代码验证 cookie

用户 username

过期时间 expires

指定路径 path

cookie 的不足

session

概念

工作原理

代码验证session

THE  END


前言 -- HTTP的无状态

HTTP的无状态是指每个请求都是独立的,从技术角度看,HTTP本身并不保持任何关于之前请求的状态信息。也就是说,一旦客户端发送了一个请求并收到了服务器的响应,连接就会关闭,而服务器不会在两次请求之间保留任何有关客户端的信息。这意味着每次新的请求都会被当作全新的交互处理,而不考虑之前的交互历史,包括登录操作。

假设 爱奇艺 中有的视频可以以游客身份观看,有的视频需要用户登录后,以普通用户的身份观看视频,有的视频需要会员身份才可以观看,由于 HTTP 是无状态的,也就是说,当用户向爱奇艺服务器发起观看某个视频的请求时,服务器需要确认用户的身份(是游客、普通用户还是会员),当用户登录后,再次发起观看视频的请求时,服务器已经不记得该用户曾经登录过了,服务器又不认识我了,服务器就像一个健忘的人,刚和它说我是谁,下一秒就不记得我是谁了,所以需要引入 cookie 和 session 技术,来标识不同用户的身份,让服务器记住我是谁

概念

服务器可以在响应中发送一个特殊的头部指示浏览器保存一些信息(cookie),并在后续请求中自动将其包含在内。这样服务器就可以通过读取这些信息识别用户。

工作原理

  • 当用户第一次访问网站时,服务器会在响应的 HTTP 报头中设置 Set-Cookie 字段,用于发送 Cookie 到用户的浏览器
  • 浏览器在接收到 Cookie 后,会将其保存到本地; 
  • 在之后的请求后,浏览器会自动在 HTTP 请求报头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器

 以  B站 为例,当登录 B站后,可以在浏览器中查看网站的 Cookie :

Cookie 分类

会话 Cookie -- 内存级存储

如果一个 Cookie 没有设置 Expires或 Max-Age属性,它将被视为会话Cookie。这类 Cookie 通常只保存在浏览器的内存中,当浏览器关闭时(实际上是浏览器进程结束),这些 Cookie 就会被删除。

由于会话Cookie是保存在内存中的,它们具有临时性质,并且不会持久化到磁盘。这使得它们适用于短期状态管理,例如保持用户的登录状态直到浏览器关闭。

持久 Cookie -- 文件级存储

当一个 Cookie 设置了 Expires或 Max-Age属性,它会被认为是一个持久化 Cookie。浏览器会在本地文件系统中创建一个文件来存储这个 Cookie,以便即使浏览器重启后也能恢复该 Cookie

持久化Cookie可以在用户关闭浏览器后仍然存在,直到过期时间到达或者用户手动清除它们。这种类型的Cookie常用于记住用户的偏好设置、语言选择等长期有效信息。

代码验证 cookie

Cookie_and_Session/Cookie · zihuixie/Linux_Learning - 码云 - 开源中国https://gitee.com/zihuixie/linux_-learning/tree/master/Cookie_and_Session/Cookie

用户 username

std::string ProveCookieWrite() // 证明cookie能被写入浏览器
{return "Set-Cookie: username=lucao;";
}

过期时间 expires

如果没有设置过期时间,那么 Cookie 是内存级存储,设置了过期时间,Cookie 是文件级存储。

    std::string GetMonthName(int month){std::vector<std::string> months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};return months[month];}std::string GetWeekDayName(int day){std::vector<std::string> weekdays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};return weekdays[day];}std::string ExpireTimeUseRfc1123(int t) // 秒级别的未来UTC时间{time_t timeout = time(nullptr) + t;struct tm *tm = gmtime(&timeout); // 这里不能用localtime,因为localtime是默认带了时区的. gmtime获取的就是UTC统一时间char timebuffer[1024];//时间格式如: expires=Thu, 18 Dec 2024 12:00:00 UTCsnprintf(timebuffer, sizeof(timebuffer), "%s, %02d %s %d %02d:%02d:%02d UTC", GetWeekDayName(tm->tm_wday).c_str(),tm->tm_mday,GetMonthName(tm->tm_mon).c_str(),tm->tm_year+1900,tm->tm_hour,tm->tm_min,tm->tm_sec);return timebuffer;}std::string ProveCookieTimeOut(){return "Set-Cookie: username=lucao; expires=" + ExpireTimeUseRfc1123(60) + ";"; // 让cookie 1min后过期}

指定路径 path

    std::string ProvePath(){return "Set-Cookie: username=lucao; path=/a/b;";}

cookie 的不足

由于 Cookie 是存储在浏览器的,存在用户的私密数据被篡改或窃取、甚至泄露的风险。

session

概念

HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制,服务器通过 Session 来记住用户的信息。与 Cookies 不同的是,Sessions的数据主要保存在服务器端,而客户端仅持有会话标识符(通常是通过一个名为session_id的cookie)。

工作原理

  • 当用户首次访问网站时,服务器会为用户创建一个具有唯一性的 Session ID,并通过 Cookie 将其发送到客户端;
  • 客户端在之后的请求中会携带这个 Session ID,服务器通过 Session ID 来识别用户,从而获取用户的会话信息;
  • 服务器通常会将 Session 信息存储在内存、数据库或缓存中

当然 Session 也存在不足,session id 也可能被盗窃。 服务器可以通过用户的异常行为(比如异常地频繁添加好友、登录地址的变更)来判断用户的数据是否面临风险,此时服务器可以让 session id 失效,避免用户的数据被窃取,此时需要重新登录,才可以继续访问资源:

  • 如果该用户的数据确实被窃取,那么窃取者就无法访问页面了,需要重新想办法获取用户账户密码等;
  • 如果 “误杀” 了用户,用户只需要按照登录的流程重新登录即可。

代码验证session

Cookie_and_Session/Session · zihuixie/Linux_Learning - 码云 - 开源中国https://gitee.com/zihuixie/linux_-learning/tree/master/Cookie_and_Session/Session

 

 

THE  END

Cookie 和 Session 通常在实际应用中会结合使用, 以达到最佳的用户体验和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5837.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。

1&#xff0c;可能是原因是你使用了scroll-view的标签&#xff0c;用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此&#xff0c;你使用overflow:auto.来使用页面的某些元素滚动&#xf…

计算机网络——网络层

重点内容&#xff1a; (1) 虚拟互连网络的概念。 (2) IP 地址与物理地址的关系。 (3) 传统的分类的 IP 地址&#xff08;包括子网掩码&#xff09;和无分类域间路由选择 CIDR 。 (4) 路由选择协议的工作原理。 目录 重点内容&#xff1a; 一.网络层提供的两种服务 二…

【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题

本篇博客给大家带来的是01背包问题之动态规划解法技巧. &#x1f40e;文章专栏: 动态规划 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺便…

yolov11 pose 推理代码

目录 效果图: yolo_pose.py 效果图: yolo_pose.py import osimport cv2 from PIL import Imagefrom ultralytics import YOLO import json from pathlib import Path import tqdmclass YOLOPose:def __init__(self, detections_file):self.detections_file = detections_f…

MFC程序设计(二)基于对话框编程

从现在开始&#xff0c;我们将以基于对话框的MFC应用程序来讲解MFC应用 向导生成基于对话框MFC应用程序 对话框是一种特殊类型的窗口&#xff0c;绝大多数Windows程序都通过对话框与用户进行交互。在Visual C中&#xff0c;对话框既可以单独组成一个简单的应用程序&#xff0…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

深入探讨视图更新:提升数据库灵活性的关键技术

title: 深入探讨视图更新:提升数据库灵活性的关键技术 date: 2025/1/21 updated: 2025/1/21 author: cmdragon excerpt: 在现代数据库的管理中,视图作为一种高级的抽象机制,为数据的管理提供了多种便利。它不仅简化了复杂查询的过程,还能用来增强数据的安全性,限制用户…

75,【7】BUUCTF WEB [Weblogic]SSRF(未作出)

看到这个更是降龙十八掌 给的源代码进不去 给的靶场打不开 未完待续

16_动态提示窗口_协程延时

创建动态提示窗口DynamicWnd.cs 编写代码 using UnityEngine; using UnityEngine.UI; //功能 : 动态窗口界面 public class DynamicWnd : WindowsRoot{public Animation tipsAni;public Text txtTips;protected override void InitWnd() {base.InitWnd();//在启动时先隐藏提示…

麒麟监控工具rpm下载

确认系统 cat /etc/.productinfo麒麟v10 sp1 sp2 sp3 rpm包下载链接 sar - sysstat mtr iostat - sysstat netstat - net-tools https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/Packages/sysstat-12.2.1-7.p01.ky10.x86_64.rpm https://update.cs…

2024年智慧消防一体化安全管控年度回顾与2025年预测

随着科技的飞速发展&#xff0c;智慧营区一体化安全管控在2024年取得了显著进展&#xff0c;同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大&#xff1a;国家对消防安全的重视程度不断提高&#xff0c;出台了一系列涵盖技术创新、市场应用、人才培…

C#深度神经网络(TensorFlow.NET)

C#深度神经网络 文章目录 C#深度神经网络前言专业术语讲解模型[Model]向量[Vector]矩阵[Matrix]张量[Tensor]批量大小&#xff08;Batch Size&#xff09;迭代次数&#xff08;Epochs&#xff09;交叉熵[Cross Entropy] 训练流程数据预处理数据打标签数据转换标准化/归一化选择…

java 根据前端传回的png图片数组,后端加水印加密码生成pdf,返回给前端

前端传回的png图片数组&#xff0c;后端加水印加密码生成pdf&#xff0c;返回给前端 场景&#xff1a;重点&#xff1a;maven依赖controllerservice 场景&#xff1a; 当前需求&#xff0c;前端通过html2canvas将页面报表生成图片下载&#xff0c;可以仍然不满意。 需要java后…

Linux(LAMP)

赛题拓扑&#xff1a; 题目&#xff1a; 安装WEB服务。 服务以用户webuser系统用户运行。 限制WEB服务只能使用系统500M物理内存。 全站点启用TLS访问&#xff0c;使用本机上的“CSK Global Root CA”颁发机构颁发&#xff0c;网站证书信息如下&#xff1a; C CN ST China…

vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)

管理员管理 搭建管理员页面 在views中创建一个manager文件夹&#xff0c;并创建ManagerIndexView.vue、MangagerListView.vue、UserList.vue <!-- src/views/manager/ManagerIndexView.vue --> <template><!-- 作为一个占位符&#xff0c;用于渲染与当前 URL…

CSRF漏洞学习总结

一、什么是CSRF漏洞&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种网络攻击&#xff0c;它利用受害者在受信任网站上的已认证会话&#xff0c;来执行非预期的行动。这种攻击的核心在于&#xff0c;攻击者能够诱使受害者…

前端Vue2项目使用md编辑器

项目中有一个需求&#xff0c;要在前端给用户展示内容&#xff0c;内容有 AI 生成的&#xff0c;返回来的是 md 格式&#xff0c;所以需要给用户展示 md 格式&#xff0c;并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Codeforces Round 1000 (Div. 2)(前三题)

A. Minimal Coprime 翻译&#xff1a; 如果 l 和 r 互为同素数&#xff0c;则正整数 [l,r] 的一段称为同素段。 如果一个共素数段 [l,r] 不包含任何不等于它本身的共素数段&#xff0c;那么这个共素数段 [l,r] 就叫做最小共素数段。为了更好地理解这句话&#xff0c;可以参考注…

数据库事务详解

事务-1-数据库事务 今天聊一聊数据库的事务&#xff0c;这里以MySQL为例子。 在MySQL中&#xff0c;事务&#xff08;Transaction&#xff09;是一组SQL操作的集合&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;确保数据的一致性和完整性。事…