保持用户状态 session 和 cookie ,token
1.理解 session 和 cookie
让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的(服务器端不知道请求是否是来自同一个客户端),而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
1.1 理解cookie机制
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie
1.2 理解session机制
关闭浏览器会话结束, session id 用于区分不同的客户端,解决http 无状态的问题
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id
保存这个session id的方式可以采用cookie,一般这个cookie的名字都是类似于 SEEESIONID
1.2.1 Session特性:
Session是一种Web会话中的常用状态之一。
每个客户端的Seesion是独立存储的。使用session id 来区分
Session不能跨进程访问,只能由该会话的用户访问。应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的。
当会话终止,或过期时,服务器就清除Session对象。
实际上,服务器不知道会话是否是结束,服务器一般是判断距离上一次收到客户端发送的session id时间间隔超过了session的超时设置
Session常用于保存登录用户的ID.
1.2.2.session中保存的对象需要序列化
最近做一个项目的时候,发现session中的对象时好时坏,有时候能够取出来,但是经常发生类转换异常的错误,
但是DEBUG的时候却发现明明就是同一个对象类型的对象,居然还是会包转换错误
通过在网上查找资料之后发现,在session中保存的对象最好是序列化,不然很容易导致类转换的时候发生异常,
不过对于一般的数据类型就不需要了。。。。
1.2.3. session和cookie 使用场景
a. 当用户登录账户后关闭了 窗口,此时用户点击历史记录中的登录记录,如果想要用户必须再次登录需要用到session
b. 当用户登录账户后关闭了 窗口,此时用户点击历史记录中的登录记录,如果想跳过登录,直接访问内容需要用到cookie(在一定时间内可以使用历史登录信息自动登录)
用户不多的情况下 session 和cookie 就够用了
===================================================================
2.token 的产生 (wep api)
上面说到的Session和Cookie机制来保持会话,会存在一个问题:客户端浏览器只要保存自己 的SessionlD即可,而服务器却要保存所有用户的Session信息,这对于服务器来说开销较 大,而且不利用服务器的扩展(比如服务器集群时,Session如何同步存储就是个问题)!
于是有人思考,如果把Session信息让客户端来保管而且无法伪造不就可以解决这个问题了?
进而有了 Token机制。
Token俗称为〃令牌〃,它的构成是:
• uid:用户唯一身份标识
• timestamp:当前时间戳
• sign:签名字符串,防止第三方伪造数据;签名密钥是存储在服务器端的,其它人无法知
道
•其它附加参数。
2.1 Token 的应用
在web领域基于Token的身份验证随处可见,在大多数使用web api 的互联网公司中,token是多用户下处理认证的最佳方式