小白也能看懂的Cookie跟Session的区别

1、什么是Cookie?

首先为了能充分理解为什么引入Cookie和Cookie是什么,先看了例子。不然官网上定义的概念不太容易看懂。

eg:我今天想找老王吃放,打电话给老王

Me:老王啊,上次白剽很爽,今天再一起吃个饭呗?
老王:今天有点事啊,下次再约呗
Me:我插,有啥事比吃饭还重要啊,你这日子过退步了
老王:额,在哪里吃?
Me:上海和平饭店。。。。旁边的烧烤店
老王:我靠,我听和平饭店还爽了一波,TM变成了烧烤店。。。
。。。。结束

例子看完了,在看看一些官网上一些专业术语的定义。
会话:由一组请求和响应组成(理解为上面例子中的“对话”),是围绕着一件相关事情(“吃饭”)所进行的请求和响应。这些请求响应之间一定是需要有数据传输的(“每次对话的时候都应该知晓上次的内容”)。即是需要进行会话状态跟踪 (想等于会话数据传输)。
为什么要引入Cookie?
上面说了会话是具备会话状态跟踪的,然而网上的请求和响应一般都是HTTP协议,它是中无状态协议,在不同的请求间是无法进行数据传输的。那么要进行网络会话状态跟踪怎么做呢?这就引进了Cookie。

什么是Cookie?
Cookie由服务器生成,保存在客户端的一种信息载体。最简单的网上一个例子,京东购物网不登录的时候可以将商品加入购物车,本机关闭浏览器再打开浏览器进入京东页面,购物车里面数据依旧在,只要不删除Cookie或Cookie没有失效,那么购物车数据都在。当然换台电脑肯定就没有了,说明其实Cookie的数据是存在本地浏览器缓存中的数据。

Cookie怎么生成的?
用户第一次提交请求后,服务器就会生成Cookie,并将其封装到响应头中,以响应的方式发送给客户端。客户端受到这个响应之后,将Cookie保存到客户端。客户端再次发送同类请求后,在请求中会携带保存在客户端中的Cookie数据,由服务器会话进行跟踪。

2、什么是Session?为什么需要Session?

Session,即会话,从技术面角度来看跟Cookie都是一样,都是Web开发中的一种会话状态跟踪技术。
Session和Cookie不同的是,Cookie是将会话状态(会话状态可以理解为就是会话之间的数据)保存在客户端,而Session是将会话状态保存在服务端。

为什么需要Session?
Cookie将数据保存在客户端,也就是我们本地电脑的浏览器中,清空Cookie或者换一台电脑之后这些数据就没有了。那如果用户登录了保存的购物信息,不仅仅是要在本机电脑能看到,用别的电脑登录用户名也要看到之前保留的购物车信息。之前Cookie只能把数据保存在浏览器缓存中,那么怎么解决只要用户登录了,别的电脑也能查看之前数据,这就引进了Session。

3、Session的工作原理

总结:当客户第一次提交请求时,服务器会生成一个32位的随机字符串JSessionId和一个Session,并以这个JSessionId作为key,以Session作为value放在Map.Entry中作为Session列表,同时服务器会把这个32位的JSessionId包装成一个cookie发送给客户端。客户端拿到这个cookie把它存到浏览器缓存中,然后客户端又发送一次请求,这次请求发出的时候就会携带缓存中32位的JSessionId发送给服务器,服务器接收到这个JSessionId以后,会从之前的Session列表(是一个Map)根据key=JSessionId去找,找到了之后就可以拿到Session里面的信息数据了。

  **整个session工作原理可以分为四步:**

(1) 写入Session列表:客户第一次提交请求,会生成一个以JSessionId和一个Session,存入到Session列表中(Map);
Session列表
(2) 服务器生成并发送Cookie。Session信息写入到Session列表之后,系统会自动将JSessionId作为name,以Cookie的形式存放在响应报头中,服务器将Cookie发送到客户端
(3) 客户端接收并发送Cookie。客户端接收到Cookie之后会将其放入到浏览器缓存中,只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。用户第二次请求会将缓存中的Cookie伴随头部信息发送给服务器
(4) 从Session列表中查找。服务器接收到客户端发送过来的Cookie中的JSessionId之后,就去Session列表中根据key查找,查找到了就返回Session数据。

4、Session的失效(Session超时)

web开发中引入了Session超时的概念,例如我们126邮箱可以选择默认10天登录,那么Session失效时间就是10天,10天之后又要重新勾选登录。当然也有的网站session默认设置为30分钟。
如何使用:
Session超时时间设置

5、Cookie禁用后的Session

之前我们知道每次客户端在此发送请求的时候都会携带一个包含了JSessionId的Cookie,然后服务器收到了这个JSessionId之后从Session列表的Map中根据key=JSessionId去查找,然后得到Session将结果返回给客户端,客户端拿到数据。那么如果Cookie禁用了怎么办?当然这个场景其实很多网站是禁止Cookie别禁用的,不然网站无法使用。但是我们还是得考虑某些特殊场景的需求,便于我们深入理解。

Cookie禁用之后流程变化?
Cookie禁用之后,客户端在次请求的时候是没有带JSessionId的Cookie,服务器没有拿到带JSessionId的Cookie那么就默认是客户端的第一次请求,随机产生一个JSessionId和Session,但是这个JSessionId给客户端是没有Cookie缓存数据的。所以会话就无妨实现跟踪了。

Cookie禁用Session怎么能继续使用?
由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种:效果见截图,在URL后面加JSessionId可以请求到服务器中的Session数据。
一种是作为URL路径的附加信息,
另一种是作为查询字符串附加在URL后面。

在这里插入图片描述
代码中如何实现呢?

1、重定向URL重写的实现
重定向的URL重写,URL接上自己获取Session的接口名称
我们可以使用重定向转到我们要获得Session数据的接口,然后URL重写就可以达到我们之前把字符串加入到URL的目的。

2、超链接的URL重写的实现
超链接的URL重写,跳转功能

禁用Cookie之后我们同样可以向服务器请求拿到Session信息,但是解决方法都是URL之后加上了JSessionId,这样直接暴露在浏览器上,比不禁用Cookie更加不安全,所以很多网站是不允许禁用Cookie的。

6、应用场景
session:
除非是纯静态的页面,否则都会用到session来记录用户的行为。生产环境中经常用到的单点登录功能

cookie典型应用场景:
1.判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。而修改账户密码等操作也需要对其登陆状态进行判断。

2.另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。

全文完,如有不清楚之处,感觉各位同僚指点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值