HTTP中的Cookie与Session

一、背景

HTTP协议是无状态无连接的。

无状态:服务器不会保存客户端历史请求记录,每一次请求都是全新的。

无连接:服务器应答后关闭连接,每次请求都是独立的。

无状态就导致服务器不认识每一个请求的客户端是否登陆过。

这时我们就可以用 Cookie 和 Session 来记录客户端用户信息。

二、Cookie

1、理解

Cookie:是服务器发送到用户浏览器并保存在浏览器上的一小块数据,用于下次对服务器请求时加上客户端信息。

2、原理

当用户第一次访问网站时,服务器会在响应的 HTTP 头中设置 Set-Cookie 字段,用于发送 Cookie 到用户的浏览器。
浏览器在接收到 Cookie 后,会将其保存在本地(通常是按照域名进行存储)
在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。

3、分类

会话 Cookie(Session Cookie)

在浏览器关闭时失效。一般是内存级存储,浏览器启动是一个进程,在进程内部保存 Cookie 数据。

持久 Cookie ( Persistent Cookie)
带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。一般是文件级 Cookie 会在自己工作目录下保存 Cookie 数据。

4、Cookie 基本格式

Set-Cookie:<name>=<value>

<name> 相当于 key,<value> 相当于 value

举例:Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC; path=/;domain=.example.com; secure; HttpOnly

expires:Cookie 过期时间,如果没有设置过期时间,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期。

时间格式:RFC 1123标准,GMT格林威治标准时间,UTC协调世界时

path:限定 Cookie 作用范围路径,/表示根目录,在指定域下都能使用

domain:仅使用HTTPS协议才能发送 Cookie

HttpOnly:意味着 Cookie 不能被客户端脚本(javascript)访问避免被攻击

但是单独使用 Cookie 由于存在客户端泄漏,所以引入 Session

三、Session

1、理解

HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于 HTTP协议是无状态的(每个请求都是独立的),因此服务器需要通过 Session 来记住用户的信息。

2、原理

实际上 session_id 是一个类,里面不仅记录用户各种登录属性,还有许多关于用户的细节,这样应答不会显示返回用户私密信息,session_id 里面也有属性能判断当前用户请求中的 session_id是否是合法的,以此来防止 session_id 被盗取。如果非法就让 session_id 失效。

3、用途

(1)用户认证,会话管理

(2)存储用户临时数据

(3)实现分布式系统会话管理

4、代码

实现一个session_id类

#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <ctime>
#include <unistd.h>
#include <unordered_map>
// 用来进行测试说明
class Session
{public:Session(const std::string &username, const std::string &status):_username(username), _status(status){_create_time = time(nullptr); // 获取时间戳就行了,后面实际需要,就转化就转换一下}~Session(){}public:std::string _username;std::string _status;uint64_t _create_time;//当然还可以再加任何其他信息,看你的需求};using session_ptr = std::shared_ptr<Session>;class SessionManager
{
public:SessionManager(){srand(time(nullptr) ^ getpid());}std::string AddSession(session_ptr s){uint32_t randomid = rand() + time(nullptr); // 随机数+时间戳,实际有形成 sessionid 的库,比如 boost uuid 库,或者其他第三方库等std::string sessionid = std::to_string(randomid);_sessions.insert(std::make_pair(sessionid, s));return sessionid;}session_ptr GetSession(const std::string sessionid){if(_sessions.find(sessionid) == _sessions.end()) return nullptr;return _sessions[sessionid];}~SessionManager(){}
private:std::unordered_map<std::string, session_ptr> _sessions;
};

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

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

相关文章

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.什么是贪心算法 与其说是…

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖&#xff1f; 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存&#xff1a;单例池&#xff0c;经历过完整bean生命&#xff0c;单例Bean对象2.2 二级缓存&#xff1a;提前暴露的Bean2.3 三级缓存&#xff1a;打破循环 3. S…

计算机网络通关学习(一)

简介 之前我通过王道的考研课进行了计算机网络的学习&#xff0c;但是在秋招准备过程中发现之前的笔记很多不足&#xff0c;学习的知识不够深入和巩固&#xff0c;所以再重新对《图解HTTP》&《图解TCP/IP》进行深度学习后&#xff0c;总结出了此篇博客&#xff0c;由于内容…

【C#】添加临时环境变量

在C#中&#xff0c;可以通过System.Environment类来添加临时环境变量。临时环境变量只在当前进程中有效&#xff0c;进程结束后变量即失效&#xff0c;不会写入系统的Path中。 using System;class Program {static void Main(){// 设置临时环境变量Environment.SetEnvironment…

08_Python数据类型_字典

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 字典 字典&#xff08;Dictionary&#xff09;是一种可变容器模型&#xff0c;它可以存储任意类型对象&#xff0c;其中每个对象都存储为一个键值对。…

openmv与stm32通信

OpenMV与STM32之间的通信是嵌入式系统中常见且重要的一环&#xff0c;尤其在机器视觉和自动控制领域。两者结合可以实现图像识别、数据处理以及基于识别结果的硬件控制&#xff0c;从而广泛应用于智能小车、机器人、无人机等领域。以下将详细阐述OpenMV与STM32之间的通信过程&a…

存储数据的树形结构

目录 1、二叉查找树 2、平衡二叉树AVL Tree 3 、平衡多叉树B-Tree 4、BTree树 5 、红黑树 红黑树的应用 6.平衡树的旋转 mysql 索引数据结构&#xff1a; Btree 索引是B树在数据库中的一种实现&#xff0c;最为常见的。B树 中的B代表平衡&#xff0c;而不是二叉 1、二…

带你如何使用CICD持续集成与持续交付

目录 一、CICD是什么 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; 二、git工具使用 2.1 git简介 2.2 git的工作流程 2.3 部署g…

如何用 Scrapy 爬取网站数据并在 Easysearch 中进行存储检索分析

做过数据分析和爬虫程序的小伙伴想必对 Scrapy 这个爬虫框架已经很熟悉了。今天给大家介绍下&#xff0c;如何基于 Scrapy 快速编写一个爬虫程序并利用 Easysearch 储存、检索、分析爬取的数据。我们以极限科技的官网 Blog 为数据源&#xff0c;做下实操演示。 安装 scrapy 使…

3. Python计算水仙花数

Python计算水仙花数 一、什么是水仙花数&#xff1f; 百度答案 二、怎样使用Python计算水仙花数&#xff1f; 这里需要for循环&#xff0c;if判断&#xff0c;需要range()函数&#xff0c;需要知道怎么求个位数&#xff0c;十位数&#xff0c;百位数… 1. For循环 语句结…

CTFHub技能树-SQL注入-整数型注入

一、手动注入 思路&#xff1a;注入点->库->表->列->数据 首先使用order by探测有几列 http://challenge-215beae2f0b99b12.sandbox.ctfhub.com:10800/?id1 order by 2 我们发现order by 2 的时候有回显&#xff0c;到了order by 3 的时候就没有回显了&#xf…

k8s的环境配置

一、前期系统环境准备 准备3台主机&#xff1a;硬盘50G cpu2个 内存2G 1、3台主机同时配置 1&#xff09;关闭防火墙与selinux、NetworkManager [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/…

CSS---序号使用css设置,counter-reset、counter-increment、content配合实现备注文案的序号展示

直接上代码&#xff0c;全代码copy即可使用! <template><div class"reminder"><span class"Bold_12_body" style"line-height: 8vw">温馨提示&#xff1a;</span><br /><div class"rule-container"…

共享内存C(Linux)

在学习的时候遇到问题&#xff0c;就是将结构体作为共享内存时将string类型置入结构体内&#xff0c;导致程序出现段错误&#xff0c;后来经过排查发现共享内存是c语言的库不支持string类型&#xff0c;需要用char name[20]代替。 1.在Linux中如何查看共享内存 &#xff08;1&…

【Hot100】LeetCode—84. 柱状图中最大的矩形

目录 1- 思路题目识别单调栈 2- 实现⭐84. 柱状图中最大的矩形——题解思路 3- ACM 实现 原题链接&#xff1a;84. 柱状图中最大的矩形 1- 思路 题目识别 识别1 &#xff1a;给定一个数组 heights &#xff0c;求解柱状图的最大面积 单调栈 使用 Stack 来实现&#xff0c;遍…

go语言中的数组指针和指针数组的区别详解

1.介绍 大家知道C语言之所以强大&#xff0c;就是因为c语言支持指针&#xff0c;而且权限特别大&#xff0c;c语言可以对计算机中任何内存的指针进行操作&#xff0c;这样自然而然也会带来一些不安全的因素&#xff0c;所以在golang中&#xff0c;「取消了对指针的一些偏移&…

【C语言学习路线】

基础知识 了解C语言的历史与应用&#xff1a;了解C语言的起源、发展及其在现代开发中的地位。 安装编译环境&#xff1a;选择合适的开发环境&#xff0c;如GCC、Visual Studio、Code::Blocks等&#xff0c;进行配置。C语言基础 基本语法&#xff1a;学习C语言的基本语法&#x…

【C语言】分支和循环专题应用

分支和循环专题应用 1、随机数生成1.1rand1.2 srand函数介绍1.3 time函数介绍1.4 设置随机数的范围 2、猜数字游戏的代码及实现 通过了分支和循环的介绍学习之后&#xff0c;我们可以运用分支和循环语句写出一些有趣的代码了&#xff0c;让我们来一起探索吧&#xff01; 写一个…

node.js 中的进程和线程工作原理

本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位&#xff0c;其是进程中的一个执…

文献多\bibliographystyle和文献少\begin{thebibliography}

\bibliographystyle 和 \begin{thebibliography} 是 LaTeX 中用于处理文献引用的两种不同方法。它们各自有不同的用法和适用场景&#xff1a; 1. \bibliographystyle 和 \bibliography 这种方法是利用 BibTeX 来管理参考文献数据。通常在文献量大、格式要求严格的情况下使用。…