餐厅网站开发背景/宁波seo在线优化哪家好
目录
1.1 -> 定义
1.2 -> 工作原理
1.3 -> 分类
1.4 -> 安全性
2.1 -> 基本格式
2.2 -> GMT vs UTC
3.1 -> 安全性考虑
3.2.2 -> 测试自动提交
3.2.3 -> 测试写入过期时间
3.2.4 -> 测试路径path
4 -> 单独使用Cookie会存在什么问题
1 -> 引入HTTP cookie
1.1 -> 定义
HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发送请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。
1.2 -> 工作原理
- 当用户第一次访问网站时,服务器会在响应的HTTP头中设置Set-Cookie字段,用于发送Cookie到用户的浏览器。
- 浏览器在接收到Cookie后,会将其保存在本地(通常是按照域名进行存储)。
- 在之后的请求中,浏览器会自动在HTTP请求头中携带Cookie字段,将之前保存的Cookie信息发送给服务器。
1.3 -> 分类
- 会话Cookie(Session Cookie):在浏览器关闭时失效。
- 持久Cookie(Persistent Cookie):带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
- 如果cookie是一个持久性的cookie,那么它其实就是浏览器相关的,特定目录下的一个文件。但直接查看这些文件可能会看到乱码或无法读取的内容,因为cookie文件通常以二进制或sqlite格式存储。一般我们查看,直接在浏览器对应的选项中直接查看即可。
类似下面这种方式:
1.4 -> 安全性
由于Cookie是存储在客户端的,因此存在被篡改或窃取的风险。
用途
- 用户认证和会话管理(最重要)
- 跟踪用户行为
- 缓存用户偏好等
- 比如在chrome浏览器下,可以直接访问:chrome://settings/cookies
2 -> 认识cookie
- HTTP存在一个报头选项:Set-Cookie,可以用来进行给浏览器设置Cookie值。
- 在HTTP响应头中添加,客户端(如浏览器)获取并自行设置并保存Cookie。
2.1 -> 基本格式
Set - Cookie: < name >= <value>
其中:
<name>是Cookie的名称,<value>是Cookie的值。
完整的Set - Cookie
Set - Cookie: username = zzl; expires = Thu, 5 Dec 2024 12:00:00
UTC; path = / ; domain = .example.com; secure; HttpOnly
时间格式必须遵守RFC 1123标准,具体格式样例:Tue, 01 Jan 2030 12:34:56 GMT或者UTC(推荐)。
关于时间解释
- Tue:星期二(星期几的缩写)
- ,:逗号分隔符
- 01:日期(两位数表示)
- Jan:一月(月份的缩写)
- 2030:年份(四位数)
- 12:34:56:时间(小时、分钟、秒)
- GMT:格林威治标准时间(时区缩写)
2.2 -> GMT vs UTC
GMT(格林威治标准时间)和 UTC(协调世界时)是两个不同的时间标准,但它们在大多数情况下非常接近,常常被混淆。以下是两者的简单解释和区别:
1. GMT(格林威治标准时间):
- GMT是格林威治标准时间的缩写,它是以英国伦敦的格林威治区为基准的世界时间标准。
- GMT不受夏令时或其他因素的影响,通常用于航海、航空、科学、天文等领域。
- GMT的计算方式是基于地球的自转和公转。
2. UTC(协调世界时):
- UTC全称为“协调世界时”,是国际电信联盟(ITU)制定和维护的标准时间。
- UTC的计算方式是基于原子钟,而不是地球的自转,因此它比GMT更准确。据称,世界上最精确的原子钟50亿年才会误差1秒。
- UTC是现在用的时间标准,多数全球性的网络和软件系统将其作为标准时间。
GMT和UTC的英文全称以及相关信息如下:
1. GMT(格林威治标准时间)
- 英文全称:Greenwich Mean Time
- GMT是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义为通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。
- 但值得注意的是,地球的自转是有些不规则的,且正在缓慢减速。因此,格林尼治时间已经不再被作为标准时间使用。
2. UTC(协调世界时)
英文全称:Coordinated Universal Time
- UTC是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
- UTC被广泛使用在计算机网络、航空航天等领域,因为它提供了非常准确和可靠的时间参考。
总结来说,GMT和UTC都曾是或现在是国际上重要的时间标准,但由于地球自转的不规则性和原子钟的精确性,UTC已经成为了全球性的标准时间,而GMT则更多被用作历史和地理上的参考。
区别:
- 计算方式:GMT基于地球的自转和公转,而UTC基于原子钟。
- 准确度:由于UTC基于原子钟,它比基于地球自转的GMT更加精确。
在实际使用中,GMT和UTC之间的差别通常很小,大多数情况下可以交换使用。但在需要高精度时间计量的场合,如科学研究、网络通信等,UTC是更为准确的选择。
关于其他可选属性的解释
- expires=<data>[要验证]:设置Cookie的过期时期/时间。如果未指定此属性,则Cookie默认为会话Cookie,即当浏览器关闭时过期。
- path=<some_path>[要验证]:限制Cookie发送到服务器的哪些路径。默认为设置它的路径。
- domain=<domain_name>:指定哪些主机可以接受该Cookie。默认为设置它的主机。
- secure:仅当使用HTTPS协议时才发送Cookie。这有助于防止Cookie在不安全的HTTP连接中被截获。
- HttpOnly:标记Cookie为HttpOnly,意味着该Cookie不能被客户端脚本(如JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。
以下是对Set-Cookie头部字段的简洁介绍
属性 | 值 | 描述 |
username | zzl | 这是Cookie的名称和值,标识用户名为“zzl”。 |
expires | Thu,5 Dec 2024 12:00:00 UTC | 指定Cookie的过期时间。在这个例子中,Cookie将在2024年12月5日12:00:00 UTC后过期。 |
path | / | 定义Cookie的作用范围。这里设置的根路径为/,意味着Cookie对.example.com域名下的所有路径都可以用。 |
domain | .example.com | 指定哪些域名可以接收这个Cookie。点前缀(.)表示包括所有的子域名。 |
secure | - | 指示Cookie只能通过HTTPS协议发送,不能通过HTTP协议发送,增加安全性。 |
HttpOnly | - | 阻止客户端脚本(如JavaScript)访问此Cookie,有助于防止跨站脚本攻击(XSS)。 |
注意:
- 每个Cookie属性都以分号(;)和空格( )分割。
- 名称和值之间使用等号(=)分隔。
- 如果Cookie的名称或值包含特殊字符(如空格、分号、逗号等),则需要进行URL编码。
3 -> cookie的生命周期
- 如果设置了expires属性,则Cookie将在指定的日期/时间后过期。
- 如果没有设置expires属性,则Cookie默认为会话Cookie,即当浏览器关闭时过期。
3.1 -> 安全性考虑
安全性考虑
- 使用secure标志可以确保Cookie仅在HTTPS连接上发送,从而提高安全性。
- 使用HttpOnly标志可以防止客户端脚本(如JavaScript)访问Cookie,从而防止XSS攻击。
- 通过合理设置Set-Cookie的格式和属性,可以确保Cookie的安全性、有效性和可访问性,从而满足Web应用程序的需求。
3.2 -> 安全测试cookie
Comm.hpp HttpProtocol.hpp InetAddr.hpp LockGuard.hpp Log.hpp
Main.cc Makefile Socket.hpp TcpServer.hpp Thread.hpp
ThreadPool.hpp
3.2.1 -> 测试cookie写入浏览器
3.2.2 -> 测试自动提交
- 刷新浏览器,刚刚写入的cookie会自动被提交给服务器端。
3.2.3 -> 测试写入过期时间
- 这里要自己形成UTC统一标准时间,以下是C++代码。
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;
}
3.2.4 -> 测试路径path
提交到非/a/b路径下
- 比如:http://8.137.19.140:8888/a/x
- 比如:http://8.137.19.140:8888/
- 比如:http://8.137.19.140:8888/x/y
提交到/a/b路径下
核心代码:
class Http
{
private: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;}public:Http(uint16_t port){_tsvr = std::make_unique<TcpServer>(port,std::bind(&Http::HandlerHttp, this, std::placeholders::_1));_tsvr->Init();}std::string ProveCookieWrite() // 证明 cookie 能被写入浏览器{return "Set-Cookie: username=zhangsan;";}std::string ProveCookieTimeOut(){return "Set-Cookie: username=zhangsan; expires=" +ExpireTimeUseRfc1123(60) + ";"; // 让 cookie 1min 后过期}std::string ProvePath(){return "Set-Cookie: username=zhangsan; path=/a/b;";}std::string HandlerHttp(std::string request){HttpRequest req;req.Deserialize(request);req.DebugHttp();lg.LogMessage(Debug, "%s\n",ExpireTimeUseRfc1123(60).c_str());HttpResponse resp;resp.SetCode(200);resp.SetDesc("OK");resp.AddHeader("Content-Type: text/html");//resp.AddHeader(ProveCookieWrite()); //测试 cookie 被写入与自动提交//resp.AddHeader(ProveCookieTimeOut()); //测试过期时间的写入resp.AddHeader(ProvePath()); // 测试路径resp.AddContent("<html><h1>helloworld</h1></html>");return resp.Serialize();}void Run(){_tsvr->Start();}~Http(){}private:std::unique_ptr<TcpServer> _tsvr;
};
4 -> 单独使用Cookie会存在什么问题
- 安全性问题:Cookie中的数据是以明文形式传输的,这意味着在网络传输过程中,数据可能会被截取或篡改。例如,在购物场景中,如果Cookie包含了应付款项等敏感信息,攻击者可以通过在Cookie传回到服务器之前将付款值改小的操作来达到非法目的。此外,存储于本地的密码等敏感信息也可能被钓鱼网站的服务器暴力获取。
- 隐私问题:一些网站可能会利用Cookie来跟踪用户的浏览行为,这可能会涉及到用户的隐私问题。例如,某些网站可能会通过Cookie来记录用户的浏览历史,以便进行针对性的广告推送等操作。
- 数据完整性问题:由于Cookie存储在客户端,用户可以通过浏览器的设置来修改或删除Cookie,这可能会导致数据的完整性受到影响。例如,如果用户修改了Cookie中的某些关键信息,可能会导致服务器无法正确识别用户的身份或状态。
- 性能问题:Cookie会被附加在每个HTTP请求中,这无形中增加了网络流量,尤其是当Cookie数据量较大时,可能会对网络性能产生一定的影响。
- 存储限制问题:Cookie的大小通常有限制(一般在4KB左右),对于一些复杂的存储需求来说可能不够用。例如,如果需要在客户端存储大量的用户数据或者复杂的应用状态信息,Cookie可能无法满足需求。
为了解决这些问题,通常会结合使用Cookie和Session等其他技术。Session将信息默认存储在服务端数据库的表中,而只给浏览器返回一把解锁Session的钥匙(即Session ID),这样可以在一定程度上提高数据的安全性和完整性,同时也能更好地管理用户的会话状态。
感谢各位大佬支持!!!
互三啦!!!
相关文章:

【在Linux世界中追寻伟大的One Piece】HTTP cookie
目录 1 -> 引入HTTP cookie 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 分类 1.4 -> 安全性 2 -> 认识cookie 2.1 -> 基本格式 2.2 -> GMT vs UTC 3 -> cookie的生命周期 3.1 -> 安全性考虑 3.2 -> 安全测试cookie 3.2.1 -> 测试co…...

COLA学习之DDD各种术语分析(一)
小伙伴们,你们好,我是老寇,前段时间,老寇刚看完张健飞老师的两本书《代码精进之路:从码农到工匠》和《程序员的底层思维》,书中的内容让我受益匪浅,因此,我把对COLA的理解做成专栏分…...

Pygments:高效的语法高亮工具
简介:Pygments 是一个强大的 Python 库,旨在为代码和文本提供优雅的语法高亮支持。无论是 Web 开发、文档生成,还是代码审阅,Pygments 都能轻松应对多种编程语言的高亮需求。其设计简洁、功能丰富,适合需要频繁进行代码…...

算法-字符串-43.字符串相乘
一、题目 二、思路解析 1.思路: 1.双重for循环,倒序依次相乘 2.在倒序处理进位问题 3.最后返回参数的类型是string,用StringBuilder拼接,再转换为字符串 2.常用方法: 1.equals,比较对象内容是否一致 "0".eq…...

linux的vdagent框架设计
1、vdagent Linux 的 spice 客户代理由两部分组成,一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent,每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图:spice-vdagent&a…...

CV工程师专用键盘开源项目硬件分析
1、前言 作为一个电子发烧友,你是否有遇到过这样的问题呢。当我们去查看函数定义的时候,需要敲击鼠标右键之后选择go to definition。更高级一些,我们使用键盘的快捷键来查看定义,这时候可以想象一下,你左手按下ALT&a…...

qtcanpool 知 08:Docking
文章目录 前言口味改造后语 前言 很久以前,作者用 Qt 仿照前端 UI 设计了一个 ministack(https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h) 控件,这个控件可以折叠。部分用户体验后&#…...

Milvus向量数据库01-基础概念
Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …...

mysql备份数据库
MySQL备份/还原 的方法 mysql备份数据库 mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 > 文件名.sql#实例:mysql备份某个库: mysqldump -h10.*.*.9 -P3306 …...

NLP与LLM的工程化实践与学习思考 - 写在开头
NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 写在开头 0 开头的开头 0 开头的开头 24年因为一些工作原因,短暂在NLP领域遨游了半年。这半年对我的影响蛮大,一来是因为此前从没接触过这个方向学到新东西挺开心的,二来是在工程化实践…...

LeetCode322. 零钱兑换(2024冬季每日一题 28)
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

Unix、GNU、BSD 风格中 ps 参数的区别
注:本文为“不同风格中 ps 命令参数的区别”相关文章合辑。 未去重。 BSD 风格和 UNIX 风格中 ps 参数的区别 作者:Daniel Stori 译者:LCTT Name1e5s | 2017-06-17 10:53 One Last Question ps aux 以及 ps -elf 都是查看进程的方式&…...

单片机读写内部flash实现断电数据存储
在单片机编程中,读写内部Flash存储器是一种常见的方法来实现断电数据存储。这里以STM32系列单片机为例,展示如何通过HAL库进行简单的内部Flash读写操作。 以下是一个完整的示例代码,展示了如何擦除、写入和读取内部Flash中的数据。请注意&am…...

注意力机制介绍
注意力机制介绍 1.注意力机制由来,以及解决什么问题2.什么是注意力机制3.注意力机制分类及如何实现3.1 Soft Attention(常见):软注意3.1.1普通Encoder-Decoder框架3.1.2加入Attention的Encoder-Decoder框架3.1.3如何理解注意力概率分布3.1.4 Attention机制本质思想 3.2 Hard At…...

爬虫运行后数据如何存储?
爬虫运行后获取的数据可以存储在多种不同的存储系统中,具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法: 1. 文件系统 对于小型项目或临时数据存储,可以直接将数据保存到本地文件中。常见的文件格式包括&…...

C# 自动自定义截图的内容
C# 自动自定义截图的内容 using System; using System.Drawing; using System.Runtime.InteropServices; class Program {[DllImport("user32.dll")]public static extern IntPtr GetDesktopWindow();[DllImport("user32.dll")]public static extern IntP…...

Java的Stream流:文件处理、排序与串并行流的全面指南
Java的Stream流:文件处理、排序与串并行流的全面指南 Java 8 引入了 Stream API,这是一个用于处理集合数据的强大工具,它提供了一种声明式的方式来进行聚合操作。Stream 不是一个数据结构,而是一种对数据进行操作的抽象ÿ…...

[Maven]下载安装、使用与简介
很多框架的下载使用的流程和思路是差不多的,这里以maven做详细介绍。 下载安装与配置变量 下载 首先,我们要使用maven,必须先下载它的相关文件。想要下载,我们可以直接搜索maven。找到它的官网。这里不绕弯子,直接给出…...

056 WXML+ WXSS+PHP+LW+校园配送商城微信小程序开发与设计 源码 文档 全套资料
校园配送微信小程序 1.项目描述2. 1.绪论3.项目技术与功能4.界面展示5.源码获取 1.项目描述 摘 要 近几年来,随着互联网和电子商务的快速发展和普及,改变了人们日常消费模式。尤其是移动互联网的相结合,使得人们日常生活中更多的是通过手机移…...

Python 在同一/或不同PPT文档之间复制幻灯片
复制幻灯片可以帮助我们更高效地完成工作,节省大量的制作时间。通过复制现有的幻灯片,可以快速创建新的演示文稿,而无需重新设计板式样式等。此外,复制幻灯片还可以帮助我们保持内容的一致性,使整个PPT演示文稿看起来更…...

C#生成CSR(CertificateSigningRequest)和密钥
使用C#原生生成CSR(CertificateSigningRequest)和密钥。 生成的私钥妥善保存,丢失无法找回。 调用 var contents X509Helper.SigningRequestHelper.CreateSigningRequest("yourdomain.com", ["*.yourdomain.com"], X509Helper.AsymmetricAl…...

Docker 安装 Oracle创建表空间并导入数据库
一、Docker 安装Oracle 1、检查docker 版本 2、docker 下载镜像 3、 docker启动容器 4、 进入容器内部 5、安装成功,使用客户端工具连接 二、创建数据库用户与表空间 1、查询数据库文件位置 2、创建表空间 3、创建用户 4、设置权限 三、导出数据库DMP …...

elementui table子级tree懒加载bug
1. 删除子级刷新列表子级依然显示 2.更新状态子级列表未刷新 3.编辑子级后刷新页面显示状态未变更 el-table 树表格load源码 首先,load可以执行,但是只剩一个子节点就有问题,那么就直接可以定位bug在load方法里: 文件路径&am…...

AI与低代码技术融合:如何加速企业智能化应用开发?
引言 随着全球数字化转型的步伐加快,企业在智能化应用开发方面面临着前所未有的挑战和机遇。传统的软件开发方式往往需要大量的技术人员、时间和资源,而在瞬息万变的市场环境中,这种模式显得效率低下且难以满足企业快速迭代和创新的需求。 与…...

【C#】新建窗体文件,Form、UserControl
从用途、功能性和架构方面进行描述。 1. 继承自 Form 的窗体(通常是窗口): 在 C# 中,Form 是用于创建应用程序的主窗口或对话框窗口的类。当您继承自 Form 时,您创建的是一个完整的窗口,可以显示内容、与…...

ansible学习笔记之02command模块与shell模块
目录 1、概述 2、模块介绍 2.1 command模块 2.2 shell模块 2.3 小结 3、实验 3.1 测试ls命令 3.2 测试环境变量 3.3 测试操作符">" 1、概述 本文介绍ansible的command模块与shell模块,并通过实验比对两个模块的异同。 2、模块介绍 2.1…...

在Docker中部署禅道,亲测可用
1、确保centos中已安装docker docker -v 2、启动docker systemctl start docker 3、可设置docker开机启动 systemctl enable docker.service 4、获取最新版禅道开源版镜像 docker pull idoop/zentao 5、运行镜像生成禅道容器【创建 /data/www /data/data 目录】 doc…...

C++(十二)
前言: 本文将进一步讲解C中,条件判断语句以及它是如何运行的以及内部逻辑。 一,if-else,if-else语句。 在if语句中,只能判断两个条件的变量,若想实现判断两个以上条件的变体,就需要使用if-else,if-else语…...

【数学建模】线性规划问题及Matlab求解
问题一 题目: 求解下列线性规划问题 解答: 先将题目中求最大值转化为求最小值,则有 我们就可以得到系数列向量: 我们对问题中所给出的不等式约束进行标准化则得到了 就有不等式约束条件下的变系数矩阵和常系数矩阵分别为: 等式…...

【JavaWeb后端学习笔记】Spring全局异常处理器
在程序运行时,不可避免的会出现异常。在三层开发架构中,当Mapper层出现异常、如果不进行处理会抛给Service层,如果Service层也不处理则会抛给Controller层,通常Controller层有许多接口,如果对每个接口单独处理异常&…...