今天有个小白搞不懂什么是Session,可能对于很多人来讲对Session的认识还停留在面试的时候应付面试官的八股文中。今天借这个机会,我来装个逼。写下来我个人对于Session的理解。
先写下来百度百科对于Session的定义
为了满足实时远程监测系统的需求,服务器需要实时监测客户端的连接状态。为此利用ICE中间件的优点设计了一种基于面向对象ICE中间件自定义Session机制的解决方案。
首先我们知道,在很多情况下,我们常用的网络通信都是基于HTTP协议实现的,这个协议的通信是没有记忆能力的(装逼的说法是“无状态协议”),意思就是当你使用HTTP协议进行通信的话,每一次的请求都是独立的,这一次的通信跟上一次通信是没有联系的。
设想一下如果这个问题不加处理的话,就会出现下述场景:
大爷:你姓什么?
我:马。
大爷:叫什么呀?
我:冬梅
大爷:什么冬梅?
我:马冬梅
大爷:马什么梅?
我:马冬梅
大爷:马东什么?
我:404 Not Found。
这肯定是我们不能接受的,马冬梅希望大爷的几次请求之间可以建立关联。基于这个目的,马冬梅再去看大爷,都是带着饼干(Cookie)去的。
Cookie是一种在客户端设备上存储少量数据的方式,当我们把一些信息以cookie的方式保存之后,它在一个域名下是可以全局访问的,意思就是只要设置它的存储路径在域名www.zb.com下 ,那么当用户用浏览器访问时,我们就可以从这个域名的任意页面读取cookie中的信息。
使用Cookie有很多使用起来不方便的地方:比如不能存储大量数据(最大限制4kb),一个浏览器存储cookie的数量上限是300个左右,一个网站在浏览器上cookie上限是30个,还有cookie中不能直接存储中文。最最最重要的是,有很多客户需求很操蛋,他们会把你的Cookie直接禁掉(因为cookie直接把信息存储在客户端上,很不安全)
这个时候,马冬梅意识到,靠大爷不如靠自己。还是将信息保存在服务器上靠谱一点。
就这样Session出现了,Session会在每一次开启会话的时候为用户分配一个SessionID,这个ID会发送给客户端(客户端和服务器都会保存这个ID),并且之后每一次客户端对服务器发出请求的时候都会带上这个SessionID用来标记身份。注意!Session存储用户的信息是临时的,一般情况下用户把浏览器关闭的时候,这个用户的Session就会销毁。
用来获取Session的方式不同的语言是不一样的,但是思路一般都是差不多,就是Session跟着请求走的,获取Session自然也是通过Request获取。
为了防止很多分布式大神来嘲笑我我在这里先说明一下
这个文章是拿来教育小白的,现在使用Session有很多的问题
Session做请求有一个很明显的问题,上文中说了,SessionID在服务器和客户端都会保存一份,那么问题来了:假如Web服务器做了负载均衡,这时候马冬梅已经不是那个马冬梅了,但是你大爷依旧是你大爷。
可能上一个请求发到服务器A,下一个操作发到服务器B去了,这个时候Session就会丢失。
还有的时候,基于Session的相关验证,很有可能被伪造身份攻击(比如“跨站域请求伪造”),所以相比较而言基于Token的验证原理还是比较稳妥的。