cookie放在请求头_了解Session和cookie的关系这篇文章就够了

无论是刚毕业的测试小白还是已经工作了几年的测试大牛,出去面试时80%都逃不过这个问题,你是否真正明白这两个的使用方式,Session和Cookie到底什么关系?要了解session 和cookie的区别首先要了解以下概念:

一:概念理解

1、会话

去京东网站购买苹果手机,首先你会搜索苹果手机把你看重的苹果手机型号加入购物车并购买,像这样的一系列动作统称为一次会话,那么问题来了http协议是一种无状态的协议,也就是每个http协议都是相互独立的,各个协议之间并不知道上次操作的结果,网站是如何做到跟踪整个用户的会话呢,这里就要提到session跟cookie了,因为常用的跟踪技术就是session跟cookie

2、无状态

客户端和服务器直接传输的数据,响应的结果并不会记录下来,直白点就是你去饭店消费吃完饭走了,下次又来这家店消费,你跟老板打招呼说你好啊,老板心想这人谁啊,同时惯性的跟你说你好啊,因为老板3秒钟记性,就算你来店里消费几百次,老板还是不知道你是个老顾客

二:Cookie

在讲cookie前先了解下他的使用场景:

使用Chrome浏览器打开京东网站且未登录情况下我的购物车未添加商品,所以商品数量是0

v2-872dc505dabfcc9d71c6f804a6c56fbc_b.png

挑选3个商品加入购物车,此时购物车数量显示3

v2-0c0cdb3601d36378cbca3df5d4bef7fc_b.png

关闭Chrome浏览器再次打开京东首页发现购物车数量还是4,如果此时换成Firefox浏览器打开京东首页发现购物车里的商品数量是0,为什么Chrome浏览器未登录关闭浏览器后再次打开购物车商品数量没变,换个浏览器购物车商品数量就不是4了,这个场景就说明了2点:

(1)商品信息保留在本地了,未保留在浏览器缓存

(2)不同的浏览器cookie的保留路径不一样,并且各个浏览器的cookie信息互不影响

感受到cookie的使用场景后我们来了解下什么是cookie:

cookie是由服务器产生的,存放在客户端的一系列键值对组成的文本信息,他的大小最多只有4K

Set-Cookie: company=beijing

1、会话cookie和持久cookie

会话cookie是指cookie的生命期是在浏览器会话期间,关闭浏览器的话,cookie就消失了

持久cookie是指cookie存放在硬盘上并且他的生命长端是在服务端设置的,以下是cookie在服务端的产生及如何设置会话cookie和持久化cookie

服务端产生cookie的方式

Cookie cookie = new Cookie("company","beijing");

cookie.setMaxAge(60*60);

setMaxAge里面的参数为整形,单位是秒

该值大于0,表示将cookie存放在客户端的磁盘上

该值小于0,与不设置效果一样,表示cookie存放在浏览器缓存,关闭浏览器cookie失效

该值等于0,表示cookie一生成立马失效

2、不可跨域

不同浏览器之间不能共享cookie

3、cookie失效

cookie在服务端无法设置失效,只能在浏览器设置失效

三 :Session

1、Session原理

(1)服务端对session是以map的形式管理的,执行getSession(true)创建一个32位随机字符作为key放在散列表里面,value是HttpSession对象

(2)服务器生成32位的JSESSIONID,把JSESSIONID作为key放在cookie里面,JSESSIONID 的值作为value发送给客户端

(3)客户端保存session信息,下次请求服务器时会携带JSESSIONID值

(4)服务端拿到JESSIONID的值会去session列表查找对应的value

v2-4d576bf37b4ab89f9c4709758ffb5f06_b.jpg

2、session的失效

session.invalidate(); //http status 500 失效的session并不为null

3、cookie禁用后使用session进行会话跟踪

客户端不接收服务端发过来的cookie信息,但是每次客户端访问服务器时服务器都会重新生成新的JSESSIONID放到cookie里面

解决办法:

(1)服务端重定向跳转(302)url后面添加;jsessionid=value

String uri =request.getContentPath()+"/otherPage";

//解决cookie禁用后,session跟踪问题

uri =response.encodeRedirectURL(uri);

response.sendRedirect(uri);

问题:不安全,站点不允许禁用cookie,JSESSIONID会暴露在浏览器里面

(2)表单隐藏字段

<input type="hidden" name="jsessionid", value=""/>

真正 会话的结束是session的失效

4、session一致性

session+redis实现session共享,客户端第一次发送请求后,NGINX将请求发送给服务器1,由于用户未登录,服务器1创建session并且把session信息同步到redis里面,服务器1响应客户端的同时把session信息发送给客户端,客户端携带session再次访问NGINX的时候,NGINX把请求分发给了服务器2,由于服务器2上面没有session信息,服务器2拿着客户端携带的session信息去redis里面查找用户信息,找到的话就把响应返回给客户端

v2-6ebae5ee257bf2595a9f1d6f503c9968_b.jpg

四:Session和Cookie的区别

1、cookie和session都是服务端生成的,只是cookie存放在客户端,session存放在服务端

2、cookie是不安全的,黑客可以通过抓包获取用户信息,session是安全的因为存放在服务器

3、session因为存放在服务端,当session数量比较多时会占用一定的内存空间造成服务器性能低

4、单个cookie的大小是4k, 很多浏览器限制一个站点最多保存20个cookie,而session保存在服务端没有大小限制

5、cookie和session都会有时间限制,即都会过期

6、session的使用依赖cookie,会把JSESSIONID保存在cookie里面

五:场景应用

举个我们公司使用session和cookie记录登录信息的例子吧,用户输入用户名密码后查看服务端的头部信息,如下图是个post表单,输入的是用户名和密码,服务端在response请求头添加了set-cookie:JSESSION的字段记录用户信息并返回给客户端,客户端会把session信息持久化到磁盘里面,下次再次访问服务端的时候就会携带cookie信息去服务端校验用户的真实性,这样客户端和服务端就做到了会话跟踪,知道上个请求是哪个客户端发来的请求,以及此次请求的客户信息,是不是挺神奇的啊!

v2-f49a900d66edaf8f16085f121da6cb3f_b.jpg

六: 后记

虽然我都干了10年的测试,刚走出校园也是先通过软件测试培训才走入职场,匆匆就10年,可是反思下自己的职业生涯,方向选错了就需要付出更多的努力,可是方向错啦,努力也是无效努力,对于那些刚出入职场的小白朋友,刚入职场的前三年一定要找到适合自己的方向,并且努力学习专业技能,跳到大公司,一定是大公司,大公司有先进的技术,大公司能够开拓自己的视野,哪怕自己只是一个螺丝钉也比在小公司好,因为在你跳槽的时候,公司很注重你是否大公司工作背景,如果你没有那么你需要非常努力或者你非常有天赋或者机遇特别好,才能少走弯路,在年轻的时候多赚些钱。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值