session与cookie的来源与区别

news2025/2/12 23:45:59

目录

1.什么是HTTP?

2.cookie

3.session

4.cookie和session的区别


如果你对于session 和cookie 只有一点模糊理解,那么此文章能帮你更深入理解session和cookie ,依旧和上篇文章一样,我们采用问题的方式来一步步探索,这篇文章会告诉你这些:

为什么要有session 和cookie

session 和cookie它们是如何工作的?

session和cookie 它们有什么联系,又有什么区别?

 

为什么要有session和cookie?

session 和cookie 为什么会出现那么我们只能问http了,http创建这两个东西又是为什么呢?所以我们首先得了解一下这个http;

1.什么是HTTP?

Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) ,它是基于 TCP/IP 协议的应用层协议。它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式。

简单的说,http 是互联网请求数据传输的一种规范,它规定了客户端与服务器之间互相通信的数据格式规则。它是基于TCP/IP协议之上的应用层协议,这就好像球类运动(TCP/IP)和足球(HTTP)的关系,在球类运动里规定一个只能用脚踢的球类运动规则,这类规则形成的运动名字就叫足球。

HTTP 协议一共有几个特点:支持客户/服务器模式;简单快速;灵活;无连接,无状态。其中HTTP无状态的特性将和我们今天的主题有密切关系。

上面http的特点提到了无状态,那么http的无状态是什么意思呢?

http 是一种无状态的协议,”无状态”其实这种描述有点模糊,这里的无状态更精确的说法应该是”不保存请求的状态信息”的意思,http要做的事就是规范WEB数据传输格式,协议本身不会对请求和响应的通信状态进行保存。

至于http什么要这么做,主要有下面几个原因:

1、职责单一化:既然我是个协数据传输协议,那么我就只做协议层需要做的事情,保存临时请求状态类的信息那是缓存的功能。

2、方便扩展:只有把一件事情做的越简单,那么它的伸缩性才越好,

比如:如果你是生产自来水的,那你安安心心只生产自来水就行了,这样的话那些生产任何饮料的都可以从你这里进货,只要需要自来水的地方都可以和你合作。但是结果你为了水的味道好一点,在水里面加了一点糖,这样就会造成做茶类的饮料没办法和你合作了,因为茶里面是不需要加糖的。

3、提升效率:不需要保存额外的信息请求的速度当然要快一些。

那么http的无状态会带来什么问题吗?

因为http是不保存状态信息的,所以这就意味着两次请求之间是没办法建立联系,这就造成了前一个请求已经做过的事情,后面的请求还是照样要做一次。

比如我们最常见的系统功能”登录验证”:

我们系统很多功能都需要进行登录才可以操作,比如说,查看个人信息、下单、加好友.........等等;

这里如果我们不保存用户登录的状态信息,那么我每次查看个人信息之前都需要先进行登录,然后才能查看到个人信息,那么多个请求就会以这样的形式体现出来。

查看个人信息请求:登录=>查看个人信息

下单请求: 登录=>下单

加好友请求: 登录=>发送好友申请

当你看到上面的请求执行情况,你应该就发现了问题,明显登录其实只要做一次就行了,那么我们是否可以在用户第一次登录后就把用户的登录状态保存起来呢,以后的请求只需要通过这个状态来判断用户是否有进行登录,那么是否就能避免用户需要重复的登录呢? 所以就出现了我们的http状态保持方案,cookie 和session;

2.cookie

cookie是把请求状态存储在客户端的一种解决方案;因为http的无状态,我们无法识别历史请求的状态信息,所以就想出了一个办法,服务端会在每个客户端第一次请求的时候颁发一个通行证,不管服务端和客户端都可以往这个通信证里存入状态信息,然后交由客户端保存,客户端以后每次向服务器发起请求的时候都会带上这个通行证,通过在这种方式来保持请求之间的联系。

 java操作cookie如下:

//获取cookie
Cookie[] cookies= request.getCookies();
//添加cookie
Cookie cookie=new Cookie("name","susan");
//设置有效时间(秒)
cookie.setMaxAge(1000);
//当请求是HTTPS或者其他安全协议时才传输cookie
cookie.setSecure(true);
//设置cookie是否能通过 js 访问
cookie.setHttpOnly(true);
//设置cookie作用域 doman+path形成一个cookie作用范围
cookie.setDomain("http://baidu.com");
cookie.setPath("/user");
response.addCookie(cookie);

 删除cookie

主动设置有效期删除

Cookie并没有提供直接删除的方法,我们只能通过setMaxAge(-1)设置有效期来简介达到删除cookie的效果。

持久cookie: 如果通过setMaxAge设置了cookie的有效期时间大于0,则浏览器会把该cookie持久化到磁盘,然后根据设置的时间判断过期则失效。

临时cookie:当通过setMaxAge设置cookie的有效时间为负数,此时的cookie就属于一个临时cookie,临时cookie只会保存在客户端内存里面,当浏览器关闭后就会失效。

3.session

session是把状态信息保存在服务端的一种解决方案,那么为什么有了Cookie之后还需要有seesion呢,其实我们在了解cookie的特点后知道我们的cookie是存储在客户端的,所以会存在一些不可控的问题,比如说cookie可以被窃取,而且cookie的大小也被客户端所限制,所以会存在一些不安全的因素,所以那就只能把状态信息保存到服务端,交给服务端自己控制,而session则就是服务端保持状态的解决方案。

那么问题出现了,session是如何生成的呢?

当客户端(浏览器)访问服务端时服务端首先会读取cookie;

如果cookie里面包含一个JSESSIONID的值,那么服务端会根据对应的JSESSIONID 从内存里面获取对应的session。

如果cookie 没有JSESSIONID 那么服务端会认为这是用户第一次访问,那么就会新生成一个session保存到内存里面,然后把session的唯一ID添加到cookie里面,就键的名称就是我们上面的JSESSIONID。

服务端生成session并把seesion的ID添加到cookie里面后,客户端每次请求访问都会带上cookie。

Session是如何删除的? 

1、服务端可以设置session的超时时间,session超时后会被删除。

2、调用HttpSession.invalidate()方法删除sesion。

3、服务器进程停止。 

如果当cookie被禁用该如何使用session呢?

我们从session使用流程中可以知道,其实session虽然是服务端保存的,但是也还是需要客户端的配合才能使用,而这个配合通常都是cookie来保存session的sesion ID,然后客户端每次都带上cookie,服务端通过sesion ID来识别客户端的身份。

但是这样有一个问题,我们知道客户端是可以禁用cookie的,如果客户端禁用了cookie后我们如何传递这个session ID呢。

如果cookie禁用后,我们通常可以通过URL重写和增加隐藏字段的方式来传输session ID,其原理就是在客户端所有请求里面都添加一个JSESSIONID的参数,服务端再通过获取这个参数来识别客户端的请求。这种方式虽然能解决sesion ID 传递的问题,但是在存在一些问题,所以很少使用。

4.cookie和session的区别

1.存储位置不同

cookie的数据信息存放在本地(客户端)。
session的数据信息存放在服务器上。

2.存储容量大小不同

cookie存储的容量较小,一般<=4KB。
session存储容量大小没有限制(但是为了服务器性能考虑,一般不能存放太多数据)。

3.存储有效期不同

cookie可以长期存储,只要不超过设置的过期时间,可以一直存储。
session在超过一定的操作时间(通常为30分钟)后会失效,但是当关闭浏览器时,为了保护用户信息,会自动调用session.invalidate()方法,该方法会清除掉session中的信息。

4.安全性不同

cookie存储在客户端,所以可以分析存放在本地的cookie并进行cookie欺骗,安全性较低。
session存储在服务器上,不存在敏感信息泄漏的风险,安全性较高。

5.域支持范围不同

cookie支持跨域名访问。例如,所有a.com的cookie在a.com下都能用。
session不支持跨域名访问。例如,www.a.com的session在api.a.com下不能用。

6.对服务器压力不同

cookie保存在客户端,不占用服务器资源。
session是保存在服务器端,每个用户都会产生一个session,session过多的时候会消耗服务器资源,所以大型网站会有专门的session服务器。

7.存储的数据类型不同

cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。

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

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

相关文章

第七章 测试

文章目录 第七章 测试7.1 编码7.1.1 选择程序设计语言1. 计算机程序设计语言基本上可以分为汇编语言和高级语言2. 从应用特点看&#xff0c;高级语言可分为基础语言、结构化语言、专用语言 7.1.2 编码风格 7.2 软件测试基础7.2.1 软件测试的目标7.2.2 软件测试准则7.2.3 测试方…

JVM基础面试题及原理讲解

基本问题 介绍下 Java 内存区域&#xff08;运行时数据区&#xff09;Java 对象的创建过程&#xff08;五步&#xff0c;建议能默写出来并且要知道每一步虚拟机做了什么&#xff09;对象的访问定位的两种方式&#xff08;句柄和直接指针两种方式&#xff09; 拓展问题 Strin…

Flutter Widget 生命周期 key探究

Widget 在Flutter中&#xff0c;一切皆是Widget&#xff08;组件&#xff09;&#xff0c;Widget的功能是“描述一个UI元素的配置数据”&#xff0c;它就是说&#xff0c;Widget其实并不是表示最终绘制在设备屏幕上的显示元素&#xff0c;它只是描述显示元素的一个配置数据。 …

分库分表 21 招

&#xff08;一&#xff09;好好的系统&#xff0c;为什么要分库分表&#xff1f; 咱们先介绍下在分库分表架构实施过程中&#xff0c;会接触到的一些通用概念&#xff0c;了解这些概念能够帮助理解市面上其他的分库分表工具&#xff0c;尽管它们的实现方法可能存在差异&#…

自动化测试框架seldom

创建项目 | seldom文档 这个框架还是不错的&#xff0c;一直在优化&#xff0c;测试框架里的功能这里都有了。 seldom继承unittest单元测试框架&#xff0c;可以用来做UI和接口自动化项目。 安装 pip install seldom 创建项目 > seldom -P mypro 创建测试用例 # tes…

第8章 维护

文章目录 第8章 维护一、软件交付使用的工作二、软件交付使用的方式1) 直接方式2) 并行方式3) 逐步方式 8.1 软件维护的定义1、软件维护的定义2、软件维护的原因3、软件维护的类型1、改正性维护2、适应性维护3、完善性维护4、预防性维护 8.2 软件维护的特点8.2.1结构化维护和非…

12.异常-Exception|Java学习笔记

文章目录 异常介绍异常体系图一览运行时异常编译异常异常处理异常处理的方式try-catch 异常处理throws 异常处理注意事项和使用细节 自定义异常自定义异常的步骤 throw和throws的区别 异常介绍 基本概念&#xff1a;Java语言中&#xff0c;将程序执行中发生的不正常情况称为“…

【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

经过前面的铺垫&#xff0c;我们已经具备实现并发服务器的基础了&#xff0c;接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧&#xff01; 多任务回声服务器模型 在编写代码前&#xff0c;先让我们大致将多任务&#xff08;回声&#xff09;服务器的模型抽象…

mac下部署和访问 Kubernetes 仪表板(Dashboard)

简介 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者修改 Kub…

技术分享——隐私计算简介

随着数据规模的不断扩大和网络技术的快速发展&#xff0c;数据安全和隐私保护成为了热门的话题。隐私计算作为一种新兴的数据安全和隐私保护技术&#xff0c;为数据安全和隐私泄露问题提供了新的思路和方法。 2020年10月19日&#xff0c;Gartner发布2021年前沿战略科技趋势&am…

VTK源码编译安装记录与教程(VS2019+QT5.15.2+PCL1.12.1+VTK9.1.0配置,超详细)

因为PCL库&#xff08;傻瓜式安装&#xff09;中自动安装的VTK库并不完整&#xff0c;不支持QT环境的UI界面开发&#xff0c;于是&#xff0c;想用QT在VS2019上开发图形界面程序&#xff0c;需要单独自己通过VTK源码编译安装&#xff0c;再进行配置。本人安装时开发环境已经装好…

2023拒绝行业内卷!八年软件测试月薪30K*16薪行业心得 想入行必看

目前工作做软件测试工作8年&#xff0c;属于高级测试员那个级别吧&#xff01;现在看到各行各业的人都在转行学习软件测试&#xff0c;想给大家一些学习建议和忠告。 很多粉丝都跟我说今年行情很差&#xff0c;找不到工资&#xff0c;真的找不到工作了吗&#xff1f; 我们常在网…

simhash原理以及用python3实现simhash算法详解(附python3源码)

1. 为什么需要Simhash? 传统相似度算法:文本相似度的计算,一般使用向量空间模型(VSM),先对文本分词,提取特征,根据特征建立文本向量,把文本之间相似度的计算转化为特征向量距离的计算,如欧式距离、余弦夹角等。 缺点:大数据情况下复杂度会很高。 Simhash应用场景:…

Graph Learning笔记 - 长尾分布问题

Graph Learning笔记 - 长尾分布问题 分享四篇论文入门图神经网络时的学习笔记。 SL-DSGCN 论文&#xff1a;Investigating and Mitigating Degree-Related Biases in Graph Convolutional Networks 来源&#xff1a;2020CIKM 概要 GCN在图的半监督学习上能取得良好表现&a…

lora,固定模特+固定衣服,怎么实现?

在电商行业&#xff0c;经常会有一个需求&#xff0c;就是把固定的衣服让模型穿上&#xff0c;然后拍很多的图片&#xff0c;放在商品主图、详情页、买家秀...... 人工智能发展到现在&#xff0c;最近aigc也挺热门的&#xff0c;有没有办法用“人工智能”算法就实现这个功能&a…

逆向汇编反汇编——函数分析

add esp,8就是把esp调整到函数调用之前的状态&#xff0c;用以平衡堆栈 默认采用的是cdcall&#xff1a;外平栈 stdcall:内平栈 什么是堆栈平衡&#xff1f; 》原来的堆栈是什么样的&#xff0c;函数调用之后堆栈还是什么样的(即&#xff0c;esp和ebp的值保持不变)&#xf…

掌握Scala数据结构(2)MAP、TUPLE、SET

一、映射 (Map) &#xff08;一&#xff09;不可变映射 1、创建不可变映射 创建不可变映射mp&#xff0c;用键->值的形式 创建不可变映射mp&#xff0c;用(键, 值)的形式 注意&#xff1a;Map是特质&#xff08;Scala里的trait&#xff0c;相当于Java里的interface&#…

git选择指定分支中的指定目录进行合并

指定路径合并 先进入branch A &#xff1a; git checkout branchA 将dir2中的变更转移至branchA&#xff1a; git checkout branchB dir2 所有变更将出现在branchA中的dir2中&#xff0c;检查后提交即可。 git commit -m "sync branchB dir2 to branchA" 也可以…

读财报丨第二增长曲线渐显,但涂鸦智能的未来还看PaaS业务?

2022年以来&#xff0c;全球物联网行业持续低迷&#xff0c;赛道内不少玩家出现业绩下滑&#xff0c;而且陆续传出巨头企业关停相关业务板块的消息。这背后是消费电子行业库存积压&#xff0c;客户需求难以释放等宏观因素&#xff0c;导致IoT领域面临一定的经营困境。 近日&am…

STM32——07-STM32定时器Timer

定时器介绍 软件定时 缺点&#xff1a;不精确、占用 CPU 资源 void Delay500ms () //11.0592MHz { unsigned char i , j , k ; _nop_ (); i 4 ; j 129 ; k 119 ; do { do { while ( -- k ); } while ( -- j ); } while ( -- i ); } 定时器工…