月高风下,下班路上....

菜菜哥,告诉你一个秘密,但是不允许告诉任何人

这么秘密,你有男票了?~

不是,昨天我偷偷去面试了,结果挂了

这不是好事吗,上天让公司留住你.....

好吧,不过还是要请教你一个问题,cookie和session有什么相同和不同吗?

这个可能要讲很长时间

定义

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。

很简短的两段定义,但是已经道出了cookie和session本质的区别,一个位于客户端,一个位于服务端。这个特性带着浓重的色彩,实际中的应用都离不开这个定义。

存储
这里针对浏览器中的cookie来讨论,不要做过多遐想

如果抛开其他特性来说,cookie本质上是浏览器(http请求)提供的一种客户端存储的数据,但是这个存储数据有自己的一些特性,比如:cookie长度的限制,跨域的限制(当然可以在服务端配合的情况下的突破这种限制)等。就像所有的存储一样,cookie也可以保存在内存中,也可以保存在磁盘中,只不过保存在磁盘的时候是在浏览器的存储目录下,毕竟cookie是基于http的,http请求又基于浏览器。

session在很多情况下被称为会话,本质上是一种服务端的存储数据。诞生的主要原因是为了解决http无状态这种特性。既然是数据,其实就可以存储于任何介质中,像实际应用中,有存储于内存中的,也有存储于redis的。所以只要看透了它的本质,存储在哪里可能就只是一个驱动的问题了。其实完全可以自己写一个程序把session的数据存储在txt中,只不过性能上可能需要多加考虑。

有联系吗

cookie

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:

1. 客户端发送一个请求到服务器 --》

2. 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》

3. 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》

4. 服务器返回响应数据

set-cookie: session=4a0b9b1cce73c469b8a6b6a8aec294d5; domain=.xx.com; path=/; expires=Sun, 25 Aug 2019 08:21:27 -0000; secure; HttpOnly

以上过程很明显是一个最常见的场景,cookie的特性以及值是由服务端来下发,但是不要忘记cookie本质上是一种客户端技术,所以客户端其实同样能操作cookie,比如:登录的时候服务端的返回结果中可以不包含set-cookie的头部,而是把值通过正文来返回,客户端脚本通过读取返回的正文解析出结果,然后写入cookie同样能达到相同的效果。set-cookie只不过是http协议中已经约定好的格式,服务端告诉客户端需要设置cookie的协议而已。当然cookie还有其他很多特性(可能随着发展有所增加或者减少):

属性 介绍
name name字段为一个cookie的名称
value value字段为一个cookie的值
domain 可以访问此cookie的域名
path 可以访问此cookie的页面路径
expires/Max-Age 此cookie超时时间。
Size Size字段 此cookie大小
http cookie的httponly属性
secure 设置是否只能通过https来传递此条cookie

由于浏览器的安全策略,不同域名(何为不同域名,请百度)的cookie是不允许的,但是可以通过服务端的配置可以解决这个问题。

session

session的创建目的初衷就是为了让服务端记住会话,简而言之就是让服务端能识别出来是哪个客户端,既然要记住,那服务端必须要存储每个会话的数据,比如:实际项目中最常用的用户信息等。服务端存储这些用户数据没问题,最大的一个障碍是怎么样识别诸多请求中哪些是同一个会话。要解决这个问题,只依靠服务端无法解决,必须需要客户端来配合:需要上传会话的标识。

客户端上传会话的标识,必须是客户端和服务端都能支持的协议和数据,其实也可以看做是http请求支持的协议和数据,既然是基于http请求,最方便的就是利用cookie,cookie是一种key-value的数据存储格式,value的值正适合作为session的标识(session也是一种key-value的存储),在这种情况下cookie终于和session有了一定的联系。

session机制利用cookie来作为标识的传输机制,并不意味着只能用cookie,只要是服务端和客户端约定好了位置,session标识我可以放到http请求的任何位置(当然http请求必须得支持传输才可以)。你完全可以把session的标识放到http头Authorization字段,只要服务端能正确的读到此值并且正确解析即可。

有些面试官喜欢问cookie和session的相同和不同,甚至他们的联系,这样的提问在某种程度上是不太好的,容易让人错误的认为cookie和session的联系很密切,但是其实他们的联系很单纯,纯洁的朋友利用关系。

此文篇幅属于5分钟系列,更能有效利用碎片化时间,下一篇,我们也许可以讨论一下基于cookie和session的认证

程序员过关斩将--cookie和session的关系其实很简单的更多相关文章

  1. 会话Cookie及session的关系(Cookie & Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  2. Cookie与Session的区别-总结很好的文章

    Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...

  3. 程序中的Cookie 和Session

    这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...

  4. 程序员过关斩将--redis做消息队列,香吗?

    Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...

  5. 会话Cookie与session的关系

    在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用session和客户端之间进行通信,以及jsessionId是怎么回事,这并没有一个完整和正 ...

  6. 程序员过关斩将--更加优雅的Token认证方式JWT

    菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...

  7. 程序员过关斩将-- 喷一喷坑爹的面向UI编程

    摒弃面向UI编程 为何喷起此次话题,因为前不久和我们首席架构师沟通,谈起程序设计问题,一不小心把UI扯进来,更把那些按照UI来编程的后台工程师也扯了进来.今天特意百度了一下(其实程序员应该去googl ...

  8. cookie和session的关系和区别

    1.为什么会用到cookie和session 由于http请求是一种无状态的请求,一旦数据交换完毕便会关闭请求,再次交换数据则要再次发起请求,所以服务端无法通过连接追踪会话,确定用户身份,而cooki ...

  9. 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

    本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...

随机推荐

  1. 【CYH-02】NOIp考砸后虐题赛:坐标:题解

    代码: 这道题也并不难,用排序+简单动规即可.因为@Kevin_Wa 大佬放的是c++,所以我来一发Pascal. var min,max,i,a1,b1,c1,d1,n:longint; a,b,c ...

  2. 个人永久性免费-Excel催化剂功能第74波-批量排版格式利器,瞬间美化表格

    PPT和WORD的世界,充满着排版的美化操作,在Excel世界同样也需要对表格.图表的美化,此篇带你进入真正的制表专家行列,使用Excel催化剂的格式管理增强功能加上对美感的艺术造诣,对Excel表格 ...

  3. fjnuoj 1003 学长的QQ号

    题目: //QQ是一个9位数,由1,2,3,4,5,9组成,且第1.6位数字相同,第2.4位数字相同,第5.7位数字相同.            //我的QQ就在符合上诉条件中的所有9位数从小到大排第 ...

  4. Spring Boot中自定义注解+AOP实现主备库切换

    摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...

  5. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学

    前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...

  6. CEPH 自动化测试用例介绍

    1.QA 的内部逻辑关系. 首先用一个图表示一下QA的内部的逻辑关系. 2.QA的脚本介绍 3.QA脚本运行

  7. 国内CDH的MAVEN代理

    在编译CDH版本的各个开源软件时,需要从cdh-repo下载对应的jar包,但发现下载速度非常慢,甚至有时候出现下载异常的情况. 下面是国内可用的.速度非常快的一个maven代理仓库,亲测可用: ht ...

  8. java常见面试题目(一)

    在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...

  9. 图像反转(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...

  10. 【POJ - 2431】Expedition(优先队列)

    Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...