一篇文章带你明白cookie和session的区别

当前主流的登录验证主要有三种形式

第一种:cookie

第二种:session

第三种:jwt令牌

首先先来讲解一下为什么要使用这些密码来进行登录验证,因为http协议每一次请求都是独立的,所以我们发起的每一次请求,后端服务层并不知道我们是否是合法用户,到底该不该给我们提供服务,所以我们需要使用密码,这个时候问题又来了,如果我们登录之后,服务端怎么知道我们已经进行登录了呢,这时我们就要引入一个会话跟踪的概念了,当服务器判定这些请求都来源于同一个会话的时候,就会对这些请求进行数据共享,这里共享的自然也就是你的密码了,而密码的存储位置,也就是cookie和session的主要区别了

1.cookie

cookie这个方式就相当于是把密码直接返回回浏览器,我们这里进行抓包,可以发现http的请求头当中直接包含的就是我们的密码,每一次请求的时候都会把返回回来的密码放在请求头当中,做一次检验,然后再请求服务端,提供服务

2.session

如果是session的方法的话,是把请求的密码封装在服务器中的seesion类当中,只响应回来一个id,然后每次请求的时候到服务端就来检验这个id对应的session中是否有密码,如果有的话,那么说明用户就登录过了,然后放行,提供服务

但是这里要说明的是,不论是session,还是cookie,都不是特别的好,因为如果直接将密码存储到浏览器的话,容易暴露信息,并且还提供了伪造cookie的可能。而如果是session,那么一旦我们的服务是通过集群部署的,那么如果通过负载服务器,我们第一次将密码封装在了A服务器当中,而在下一次的请求当中,我们又被分配到了B服务器,那么我们自然就无法通过id查询到我们的密码,因为此时密码还封装在A服务器当中,所以这时,我们就需要用到jwt令牌技术

3.jwt令牌

jwt令牌本质上和cookie是一样的,不过个人认为集成了cookie的优点和session的优点,因为我们登录之后的令牌不仅会响应到浏览器,存储在浏览器中,然后随着每次请求头进入服务端,而且也对密码进行了加密,所以是目前最主流的会话跟踪服务。

首先需要引入依赖

然后调用jwt.builder创建令牌

这里令牌包括了三个部分

signwith是指定签名算法
setClaims是自定义内容(也就是有效负载中的内容)
setExpiration是设置令牌生效时间
compact这个是我们需要生成最后的字符串,也就是我们要的令牌

然后下面我们回到登录控制层,调用jwtutils里面的方法生成令牌,当然我们需要向里面传递一些参数,这里我们通过生成一个集合,然后将我们前端请求的json封装的实体类e中的参数,传递到集合中,这样我们就可以生成一个jwt令牌了。

生成出来的令牌大致是这样的

eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NzU1MDMxNn0.-qkXXWpds65L93hpKR3T4I6GaZ5Y25i7svdcFd6IAuw

前面是自定义的签名,中间是有效负载(存储了我们的密码等重要信息),最后是生成的电子签名,然后我们将生成的令牌响应回浏览器就好了。

最后要注意的是!!!如果使用的jdk版本高于8的话,那么在登陆时可能会出现一个报错信息,

缺少这个javax.xml.bind,这是因为这个方法在jdk8版本才有,所以如果是高版本的jdk的话需要手动配置一下依赖,配置如下。

掌握了这些会话跟踪方法后,接下来就是做一个统一的访问拦截层了,主要有Fiter和Interceper两种方式,这个在下篇文章中会讲到。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值