程序员过关斩将--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. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...
随机推荐
- 个人永久性免费-Excel催化剂功能第34波-提取中国身份证信息、农历日期转换相关功能
这两天又被刷朋友圈,又来了一个自主研发红芯浏览器,国产啊国产,这是谁的梦.就算国产了,自主了,无底线的夸大吹嘘无道德,企业如是,国家如是,大清已亡!再牛B的技术落在天天删敏感信息.无法治.无安全感可言 ...
- 总结暨JAVAWEB学习开篇(一)
匆匆,距上一篇博客已经过去7月有余,遂作文一篇总结暨JAVAWEB学习开篇. 1. 啃英文新概念.在多方讨教英语大佬后改变学习方式,通过背诵英文书籍以及多听英文录音来学习,效果还不错(等真正有成效了跟 ...
- WGS84坐标与web墨卡托投影坐标转换
许久没有使用坐标转换,记忆有些模糊了,以后还是会用到,先将WGS84与web墨卡托转换复习一下: 1.84转web墨卡托 //核心公式 平面坐标x = 经度*20037508.34/108 平面坐标y ...
- 《C# 语言学习笔记》——目录
C# 简介 变量和表达式 流程控制 3.1 布尔逻辑 3.2 goto语句 3.3 分支 3.4 循环 变量的更多内容 4.1 类型转换 4.2 复杂的变量类型 4.3 字符串的处理 函数 5.1 定 ...
- TP框架基础(四)----添加数据
[数据添加] add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 1. 数组方式数据添加 $goods = D(“Goods”); $arr = array(‘goods_name ...
- windos10专业版激活(可用)
电脑提示Windows许可证即将到期,于是自己就在网上找了一些教程,但是并没有激活成功,反而由即将到期变为了通知状态,尝试了各种密钥都不行,也下载了激活工具如暴风激活工具,KMS都不管用,尝试了好多方 ...
- spring 事务隔离级别导致的bug
事情是这样的,ios进货单有一个数量加一手,减一手的功能,每加减一次就会异步调用后台的接口,后台判断sku如果不存在就插入,存在就更新. 问题描述: 当ios发了多次请求后, 在第二次请求的时候, ...
- HTTP 400 Bad request 原因
我在使用httpclient 发送http请求时遇到问题,请求报 400 Bad request.网上都在说下面这两个原因 400 是 HTTP 的状态码,主要有两种形式: 1.bad request ...
- Android native进程间通信实例-binder结合共享内存
在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kernel\drivers\staging\android\ashmem.c.但是本篇文章不是讲解android共享内存的功 ...
- Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录
项目需求:这里暂且叫A公司吧,A公司有一套人事管理软件,需要与我们公司的软件做人员信息同步,A公司用的是SQL server数据库,我们公司用的Oracle,接口都不会开发(一万句"fuck ...