Cookie 和 Session详解 cookie和session的理解
lipiwang 2024-11-05 11:53 15 浏览 0 评论
我们为什么要用Session和Cookie?简单来说是因为Session和Cookie可以记录用户状态信息。
HTTP 最大的特点是无连接和无状态。无连接是指只有客户端请求时才建立连接,当请求完 毕之后就释放这个连接。这样就可以把资源尽快地释放出来,服务于其他客户端。HTTP 及时地 释放连接可以大大提高服务器的执行效率。
HTTP 本身是无状态的,这与 HTTP 本来的目的是相 符的,即服务器不保留与客户交易时的任何状态,每一次请求之间都是独立的。这就大大减轻 了服务器的记忆负担,从而保持较快的响应速度。就像客户和自动售货机之间的关系一样。
然而人们在浏览网页的过程中很快发现如果能够提供一些按需生成的动态信息会使 Web 变得更加 有用,就像客户在登录购物网站后,记录客户登录网站的信息;需要结账时,需要看他之前买 过什么。这种需求一方面迫使 HTML 逐步添加了表单、脚本、DOM 等客户端行为,另一方面 在服务器端则出现了 CGI(公共网关接口)规范以响应客户端的动态请求,作为传输载体的 HTTP 也添加了文件上载、Cookie 这些特性。其中,Cookie 的作用就是为了解决 HTTP 无状态 的缺陷所做出的努力,它保存在客户端。至于后来出现的 Session 机制则是又一种在客户端与服 务器之间保持状态的解决方案,它存储在服务器端。掌握 Cookie 和 Session 技术,会帮助我们 进一步了解 Web 网站页面间是如何动态传递信息的。
一. Cookie详解
(1)Cookie 的概念和工作原理:
Cookie 是指某些网站为了辨别用户身份、进行 Session 跟踪 而储存在用户本地终端上的数据(通常经过加密)。当用户在浏 览器中输入链接地址,第一次打开对应的网站时,网站就会通过 自己的服务器把用户信息暂时存储在用户本地内存或硬盘中。当 用户第二次访问该网站时,服务器就会在用户本地内存或硬盘中 读取用户信息,来判断当前上网用户的身份或用户在浏览网页时 做了哪些事。例如,当访客第一次登录网站时选中“记住我”复 选框,则 Cookie 中会记录下访客的用户名和密码,如图所示:
当用户再次访问该网站时,就能直接登录该网站。每个 Web 浏览器都会有独立的空间来存放 Cookie。这就相当于给 Web 浏览器颁发了一个通行证,每人一个,无论谁访问都必须携带自己的 通行证。这样,Web 服务器就能从通行证上确认客户身份了。这就是 Cookie 的工作原理。值得注 意的是,现在 Cookie 文件中的内容大多经过加密处理,虽然表面看上去是一些字母和数字的组合, 但是需要 Web 服务器的 CGI 处理程序才会知道它真正的含义。
(2)Cookie 经常使用的场景:
①用来记录访客的一些信息,例如,访客登录的用户名和密码,购物车里的商品信息,访客 访问网页的次数等。
②在 Web 浏览器之间传递变量,例如,如果用户需要声明一个变量 username=jessica,想把这 个变量传递到另一个页面,就可以把变量 username 用 Cookie 的形式保存下来,然后到那一页去读 取这个变量的值。
③可以把一些页面 CSS、图片存储在 Cookie 的临时文件夹中,这样当用户再次访问该网页时, 会大大提高浏览的速度。
(3)Cookie 的操作(创建、读取、删除):
①创建 Cookie。Cookie 是 HTTP 头部的 组成部分,而头部是必须在页面的其他内容 之前发送的,所以它必须最先输出。例如, Python 使用 cookiejar 来完成一个登录,网页 中的 Cookies 如图所示:
Python 中创建 Cookies 的代码如下:
输出结果如下:
②读取 Cookie。如果要管理 HTTP Cookie,先生成一个管理 Cookie 的对象,再创建属于 HTTPCookieProcessor 并支持 Cookie 的 opener 对 象。 默认情况下,HTTPCookieProcessor 使 用 CookieJar 对象,将不同类型的 CookieJar 对象作为 HTTPCookieProcessor 的参数提供,可支持不同 的 Cookie 处理。
输出结果如下:
③删除 Cookie。当 Cookie 被创建后,如果没有设置它的有效时间,那么当 Web 浏览器全部关 闭时 Cookie 就会全部删除。如果想要在浏览器关闭之前将 Cookie 删除,方法有两个:一个是将 Cookie 的对象清空即可,如 cookie_objs.clear() ;另一个是在浏览器中手动删除 Cookie,一般可以 通过在大多数浏览器上按“Ctrl + Shift + Delete”快捷键打开菜单来清除缓存和 Cookie。如果此步 骤不起作用,下面还会介绍常用的浏览器如何清除缓存和 Cookie。
④ IE8/IE9/IE10/IE11 浏览器清除缓存和 Cookie。打开 IE 浏览器,单击右上角的齿轮图标,选择 “Internet 选项”选项,如下图所示:
接下来将弹出如下图所示的对话框,
单击“删除”按钮。
接下 来又将弹出如下图所示的对话框:
选择“Cookie 和网站数据”复选框,单击“删除”按钮即可。
(4)Cookie 的生命周期:
Cookie 保存在客户端,分为内存 Cookie 和硬盘 Cookie。
如果 Cookie 不设置失效时间,那么它的生命周期是在浏览器关闭之前,它一般在内存中,也 称为内存 Cookie。如果设置了失效时间,则 Cookie 会保存到客户端的硬盘中,下次还可以继续 使用,直到过了它的有效期,一般用于长久保持用户登录状态。这个 Cookie 称为硬盘 Cookie。
需要注意的是,浏览器最多允许存储 300 个 Cookie 文件,而且每个 Cookie 文件的最大容量为 4KB ;每个域名最多允许 20 个 Cookie。到期后,浏览器会自动删除这些 Cookie 文件。如果客户 在浏览器中禁止使用 Cookie,那么 Cookie 就不起任何作用了。
(5)Cookie 的作用域:
Cookie 具有不可跨域名性。根据 Cookie 的规范,例如,浏览器访问淘宝只会携带淘宝的 Cookie,而不会携带京东的 Cookie。淘宝也只能操作淘宝的 Cookie,而不能操作京东的 Cookie。
二. Session详解
(1)Session 的概念和工作原理:
Session 是另一种记录客户状态的机制,是一次浏览器和服务器的交互的会话。会话是什么呢? 浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。为了记录 Session,在客户端和服务器端都要保存数据,客户端记录一个标记(session_id),服务器端不但存 储了这个标记同时还存储了这个标记映射的数据(key-value)。在服务器端记录的 key-value,其 中 key 是指 session_id,value 是指 Session 的详细内容。用户在做 HTTP 请求时,会生成一个随机 且唯一的 session_id,并传递给服务器,服务器把它存储在内存中。然后服务器根据这个 session_id 来查询 Session 的内容(即 value)。当关闭页面时,此 session_id 会自动注销,重新登录此页面时, 又会再次生成随机且唯一的 session_id。 Session 的工作原理如下图所示:
(2)Session 经常使用的场景:
Session 和 Cookie 在本质上没有什么区别,都是针对 HTTP 的无状态而提出的,因为是无状态 的,所以无法得知用户的浏览状态和信息。通过 Session 则可以记录用户指定的相关信息,以供用 户以此身份和信息再次登录此网页,提交请求时做确认。例如,在购物网站,通过 Session 可以记 录用户的登录信息,用户浏览了哪些商品,购物车里放了哪些商品,以及用户购买了哪些商品等。 要是没有 Session,用户每次进入一个页面都需要输入一次用户名和密码。
Session 适用于存储信息量比较少并且对存储内容不需要长期存储的情况。
(3)Session 的操作:
在 Python 中可以通过 requests.Session() 进行请求,Session 对象的作用就是自动记录 Cookies 值, 如模拟登录状态,即有些操作是必须用户登录后才可以进行的。常见的是在请求中加入 sid,或者 将 sid 写在 Cookie 中。sid 是登录接口中响应的一个字段,可以使用 jsonpath 解析获取到的 JSON 数据。Cookie 中的内容和 sid 的值在后端都是保存下来的,两者要做匹配,匹配好接口才可以正常 访问。如下例所示,通过创建,读取 Session 进行模拟登录。
(4)Session 的生命周期:
Session 的生命周期默认是 30 分钟,为了获得更高的存取速度,服务器一般把 Session 放在 内存中。每个用户都会有一个独立的 Session。Session 在用户第一次访问服务器时自动创建。需 要注意的是,只有访问 JSP、Servlet 等程序时才会创建 Session,只访问 HTML、 IMAGE 等静态 资源并不会创建 Session。如果尚未生成 Session,也可以使用 request.getSession(true) 强制生成 Session。
Session 生成后,只要用户继续访问,服务器就会更新 Session 的最后访问时间,并维护该 Session。用户每访问服务器一次,无论是否读写 Session,服务器都认为该用户的 Session“活 跃”(active)了一次。由于会有越来越多的用户访问服务器,因此 Session 也会越来越多。为防止 内存溢出,服务器会把长时间内没有活跃的 Session 从内存中删除,而这个时间就是 Session 的超 时时间。如果超过了超时时间没访问过服务器,Session 就自动失效了。Session 的超时时间可以通 过调用 Session 的 invalidate() 方法使 Session 失效。
相关推荐
- 软件测试|MySQL CROSS JOIN:交叉连接的详细解析
-
简介在MySQL数据库中,CROSSJOIN是一种用于生成两个或多个表的笛卡尔积的连接方法。CROSSJOIN不需要任何连接条件,它将左表的每一行与右表的每一行进行组合,从而生成一个包含所...
- 「MySQL笔记」left join-on-and 与 left join-on-where 的区别
-
1.摘要关于这两种写法的重要知识点摘要如下:left-join时,即使有相同的查询条件,二者的查询结果集也不同,原因是优先级导致的,on的优先级比where高on-and是进行韦恩运算连接...
- MySQL中的JOIN——联合查询的基本语法
-
MySQL中的JOIN指令用来将两个或多个表中的数据进行联合查询,根据连接条件来匹配记录,从而得到需要的结果集。在MySQL中,常见的JOIN类型包括INNERJOIN、LEFTJOIN和RIGH...
- MySQL 中的 CROSS JOIN:强大的连接工具
-
CROSSJOIN在MySQL里是一种挺特别的连接操作,它能弄出连接表的笛卡尔积。这就是说,要是表A有m行,表B有n行,那ACROSSJOINB的结果就会有m*n...
- 大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?
-
大厂必问:MySQL三表JOIN操作的解析与性能优化策略,效率又如何?点击关注,开启技术之旅!大家好,这里是互联网技术学堂,无论你是一名程序员、设计师、还是对技术充满好奇心的普通人,都欢迎你加入...
- 面试题:MySQL 的 JOIN 查询优化(mysql查询优化方法)
-
MySQL的JOIN查询优化是提升数据库性能的关键环节。以下是综合多个技术文档的核心优化策略,按优先级和实现难度分类:一、索引优化:性能提升的基础为连接字段建立索引确保参与JOIN的列(通常...
- Flink中处理维表关联技术实现路径
-
在Flink中处理维表关联大体氛围TableSQLLookupJoin和DataStream算子函数,主要技术实现路径:I.FlinkSQL/TableAPI中的Lookup...
- 深入剖析Zookeeper原理(一)整体设计
-
1.ZK集群架构设计与特性1.ZK集群架构设计:ZK主要分为三种角色:Leader(领导者):一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及...
- 多种负载均衡算法及其Java代码实现
-
首先给大家介绍下什么是负载均衡负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英...
- 一分钟了解SpringCloud中的ribbon到底是什么,原理是啥?
-
1.概念ribbon是一款客户端负载均衡器,用于微服务之间的负载均衡。首先,什么是客户端负载均衡?如图,ribbon可以通过注册中心获取服务列表,然后自己执行自己的负载均衡策略来决定要访问哪个微服务,...
- Step by Step之腾讯云短信-验证码实践
-
在商城小程序和前端上线用了一阵子之后,用户提出了体验提升的需求,如忘记密码、绑定用户、快捷注册等,作为业界最佳实践的短信验证码登录、重置密码和注册等功能开发也就提上日程了,本文就以重置密码为例,将验证...
- 10分钟入门响应式:Springboot整合kafka实现reactive
-
Springboot引入Reactor已经有一段时间了,笔者潜伏在各种技术群里暗中观察发现,好像scala圈子的同仁们,似乎对响应式更热衷一点。也许是因为他们对fp理解的更深吧,所以领悟起来障碍性更少...
- 使用java随机生成有个性的用户名,LOL地名+水浒传,合计2808个
-
*随机生成用户名*取水浒传108好汉名字*取LOL地名26个,组合而成*一共可以生成2808个不同特色的用户名如果你在上网的时候,用户名难取的话,这里有很多可选择的用户名,现提供100个...
- 深入理解Math.random()的概率分布特性
-
直接上源码/***Returnsa{@codedouble}valuewithapositivesign,*返回一个带符号的double类型的数字,说人话就是返回一个非负...
- 编程英文 - 创建/生成/构建 (create/generate/build)
-
在软件开发中,create、generate和build这三个词经常被用到,它们都与"创造"或"产生"某些东西有关,但在具体使用场景和含义上有所不同。基本含义creat...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 软件测试|MySQL CROSS JOIN:交叉连接的详细解析
- 「MySQL笔记」left join-on-and 与 left join-on-where 的区别
- MySQL中的JOIN——联合查询的基本语法
- MySQL 中的 CROSS JOIN:强大的连接工具
- 大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?
- 面试题:MySQL 的 JOIN 查询优化(mysql查询优化方法)
- Flink中处理维表关联技术实现路径
- 深入剖析Zookeeper原理(一)整体设计
- 多种负载均衡算法及其Java代码实现
- 一分钟了解SpringCloud中的ribbon到底是什么,原理是啥?
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)