• 0
  • 0
分享
  • cookie、session、sessionid与jsessionid
  • 饭团🍙 2022-06-24 16:18:40 字数 2531 阅读 1044 收藏 0

cookie、session、sessionid与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解。

我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案:

凭借柜台职员的记忆,由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当前的存款以及存取的次数,每次存取的金额是多少。

-----------这种方式表示协议本身支持状态。

使用存折的方式,然后柜台职员就把每个顾客的存款/取款的信息保存在这张折子,然后交给顾客保管,当顾客来存款/取款时,只要拿出存折,职员查看存折就对当前这位顾客的存款/取款信息一目了然。当然,你马上会想到,顾客修改这个信息怎么办?我们也有措施对每次存款/取款记录后面盖章。无盖章的就是假冒信息。但如果顾客是真的要伪造,当然印章也是可以伪造的。

-------------这种方式就是在客户端端保持状态。

使用银行卡的方式,发给每位银行用户一张银行卡,银行卡上有一个唯一的卡号,没有其它任何信息,当顾客来存款/取款时,拿出银行卡,银行把卡号输入的电脑,很快就显示当前用户的存/取款记录。这种方式的安全性就会有很大的提高。用户想要手脚只有攻破银行的服务器来修改自己的存/取款信息,这样做难度会很大。

---------这种方式就是服务器端保持状态。

Cookie与session的产生过程

我们都知道HTTP协议本身是无状态的,客户只需要简单的向服务器来发送请求下载某些文件,客户端向服务器端发送的每次请求都是独立的。对于当前的web应用,HTTP的“无状态”,导致许多应用都不得不花费大量的精力来记录用户的操作步骤。就像我们上面介绍的第一种情况,银行职员要花费大量的精力来记忆每一位用户的存/取款记录。

程序员很快发现,如果能够提供一些按需生成的动太信息,会使web的交互能力大大增强。程序员一方面在HTML中添加表单、脚本、DOM等客户端行为,来增加web应用与客户端的交互性。另一方面在服务器端测出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议添加了文件上载、cookie等特性。那cookie的原理与我们上面介绍的使用存折记录用户应为的方式是一样一样的。

通过前面的例子我们已经发现,通过cookie的方式存储信息,可能会存在一点定的安全性,因为所有的信息都是写在客户端的,客户可能会对这些信息进行修改或清除。然后就又出现session的方式用于保存用户行为,这种方式的原理与前面介绍银行卡的方式是一样的。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

cookie与session的机制与原理

cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识------------称为sessionid,如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。

保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。

经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionid传递回服务器。

Jsessionid?

Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。


作者:虫师

原文链接:https://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 概述客户端测试包括很多工作,测试工作有功能测试、稳定性测试、代码静态检查、性能测试、兼容性测试和安全测试等,辅助工作有用例管理、设备管理、项目管理等,还有很多其他工作。工程师们往往花了很多时间在做一些重复性工作,没有过多的精力投入到产品质量的深挖上去。地图客户端测试效率提升思路是不定期得组织版本耗时分析,将耗时较长工作缩短、将耗时少工作变为零耗时,从而释放人力做更多探索测试。比如:事例1:设备管理这块,没有一个公共的地方记录设备在哪位工程师手上,工程师借出还入操作比较繁琐,导致在设备调度这块耗时很长。解决方式:开发一个设备管理App,工程师只需要打开设备做借入还出操作;搭建设备管理平台,用于方...
            0 1 4375
            分享
          • 1、引言这刚刚整理完公司内部技术分享的PPT,看看时间,又已经是凌晨…喝一杯美咖,提提神,反正都已经这个时间了,索性,就直接开始写博客吧。因为最近总是被某些大佬艾特,说我这2月份更新的博文不地道了…我也是哑巴吃黄连啊~~~因为最近在给一些同学讲解接口的事情,本以为 Cookie、Cache及Session这些知识,都是逢考必过的内容,然鹅,又是我想多了。为了能让我可以多想点,今天就分享这三点姿势!!2、Cache关于缓存,我看了网上的一些教程讲解,几个字概括:     太繁琐,太啰嗦,长篇大论为了能让大家更容易理解,小鱼我以文字+流程图的形式来分享。首先,针对接口...
            1 2 7055
            分享
          •   3月28日晚间消息,今日,2023微信公开课PRO·微信之约直播开讲。会上视频号公布了包括付费订阅功能与“原创权益”扶持等多项产品计划,未来将支持创作者设立付费内容专区,同时提供包括评论区广告分成、原创内容保护等功能,助力更多创作者收入提升。2022年,视频号直播带货销售增长了800%,累计有收入的作者数对比2021年增长了2.64倍。作者:佚名原文链接:新浪科技_新浪网(sina.com.cn)
            0 0 854
            分享
          •   马斯克在执掌 X 平台之后,多次在公开场合表示要效仿微信,将 X 打造成“超级应用”。IT之家此前曾报道,X 公司首席执行官 Linda Yaccarino 在本月中旬表示 X 平台“即将支持视频通话功能”。  而马斯克本人今日在 X 平台正式官宣,X 平台将带来“音频与视频通话”选项,但目前并不确定是否只有订阅 Blue 的用户可以使用,也并不知道该特性上线的具体时间点,不过根据马斯克所述,该“音频与视频通话”功能将具有两大特性:  马斯克此前曾“毫不掩饰自己对微信模式的喜爱”,他声称:“对于那些用过微信的人来说,我认为微信实际上是一个很好的模式,它有点像推特、PayPal 以及其他一大...
            0 0 1104
            分享
          •   作为一名Tester,无论是面试还是工作,我们都常常会遇到该问题,毕竟现在大部分接手的项目都是中小型的项目,很多又是生疏行业的系统,所以这个问题就会常常伴随我们,那么遇到这个问题该怎么办呢,现在我们就分下面6点来讨论一下。  1.了解测试任务  我看网上有些博主一上来就让大家看资料了解系统,就是下面讲的第二点,当然这样做也行,但是会导致效率低下,就像我们上学时做阅读理解一样,最正确的做法应该是带着问题去看资料,所以我们应该一上来明确测试任务,然后带着这些测试任务的问题去看资料。  2.从现有资料中获取信息  明确测试任务后,就可以问研发团队要该项目的所有资料了,这里面主要包括产品需求文档(...
            0 0 1116
            分享
      • 51testing软件测试圈微信