当前主流的登录验证主要有三种形式
第一种: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两种方式,这个在下篇文章中会讲到。