程序员过关斩将--cookie和session的关系其实很简单
菜菜哥,告诉你一个秘密,但是不允许告诉任何人

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

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

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

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

这个可能要讲很长时间

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。
很简短的两段定义,但是已经道出了cookie和session本质的区别,一个位于客户端,一个位于服务端。这个特性带着浓重的色彩,实际中的应用都离不开这个定义。
如果抛开其他特性来说,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的关系其实很简单的更多相关文章
- 会话Cookie及session的关系(Cookie & Session)
会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...
- Cookie与Session的区别-总结很好的文章
Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...
- 程序中的Cookie 和Session
这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...
- 会话Cookie与session的关系
在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用session和客户端之间进行通信,以及jsessionId是怎么回事,这并没有一个完整和正 ...
- 程序员过关斩将--更加优雅的Token认证方式JWT
菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...
- 程序员过关斩将-- 喷一喷坑爹的面向UI编程
摒弃面向UI编程 为何喷起此次话题,因为前不久和我们首席架构师沟通,谈起程序设计问题,一不小心把UI扯进来,更把那些按照UI来编程的后台工程师也扯了进来.今天特意百度了一下(其实程序员应该去googl ...
- cookie和session的关系和区别
1.为什么会用到cookie和session 由于http请求是一种无状态的请求,一旦数据交换完毕便会关闭请求,再次交换数据则要再次发起请求,所以服务端无法通过连接追踪会话,确定用户身份,而cooki ...
- 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2
本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...
随机推荐
- Git 安装及使用指南
1 简介1.1 Git1.2 Github2 Git 在 Windows 下的安装和使用2.1 msysgit2.2 Tortoisegit2.2.1 安装2.2.2 配置2.2.3 简单使用 1 简 ...
- 二十、Sql Server 保留几位小数的两种做法
问题: 数据库里的 float momey 类型,都会精确到多位小数.但有时候 我们不需要那么精确,例如,只精确到两位有效数字. 解决: 1. 使用 Round() 函数,如 Round(@num,2 ...
- 六、SQL 多张表数据叠加到一个视图里面
1 create view vABC as select * from a,b,c where a.id = b.aid and b.id = c.bid ---------------------- ...
- linux初学者-iscsi篇
linux初学者-iscsi篇 之前介绍过网络文件共享系统NFS和CIFS.在系统中,设备也是可以共享的,这就是iSCSI,它可以用来建立和管理IP存储设备.主机和客户机等之间的相互 ...
- Core CLR 自定义的Host官方推荐的一种形式(第一种)
.Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函 ...
- Rust生命周期bound用于泛型的引用
在实际编程中,可能会出现泛型引用这种情况,我们会编写如下的代码: struct Inner<'a, T> { data: &'a T, } 会产生编译错误: error[E0309 ...
- poj 2524 Ubiquitous Religions(简单并查集)
对与知道并查集的人来说这题太水了,裸的并查集,如果你要给别人讲述并查集可以使用这个题当做例题,代码中我使用了路径压缩,还是有一定优化作用的. #include <stdio.h> #inc ...
- 百度网盘 人工智能书籍【Tensorflow和深度学习】
链接:https://pan.baidu.com/s/1ejCvwn08ILI2fMhBEdXR8w 提取码:6pk9
- S2:log4j
配置步骤 1.引入jar,放到lib中,jar包被项目管理 2.在src目录下copy了一个文件log4j.properties 3.使用Logger String word="会员登记 ...
- 用lilypond实现模进
基本练习通常是一个两个简单动作在不同位置上反复操练,所以打谱的时候用模进必不可少. 所谓模进,就是把一个片段平行地转移到其他音高上进行.比如 do re mi fa 可以把从do开始改成从so开始,那 ...