**Token**
Token作用于很多地方。比如我们在做单体架构TomCat搭建集群的时候,session是基于TomCat来创建的,每个TomCat都有不同的session所以我们在登录或者权限认定的时候,是无法保证session的独一性的。
使用Token去中心化:
准备一台授权的服务器,用于发放令牌。当客户端带着令牌去任意的服务时,任意服务都可以通过token获取用户的身份。
打个比方比如说钱,我给了我儿子100快钱,它可以去超市买东西,也可以去玩具城买玩具,还可以吃路边的小吃,
然后呢,超市收款小姐姐会查看我儿子的100块钱是否是真的。这就好比,服务器返回给客户端一个token,它可以随意的访问任意的项目,我们后端在获取的Token进行一个解析来判断是否让他访问。
一般生成-解析Token我们用JWT(json web token)
如何给我儿子100块钱呢:
第一步:
导入JWT依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
第二步:生成token
String token = Jwts.builder()
.setSubject(
.claim("nickName", nickName)
.claim("role", role)
.claim("perm", perm)
.setIssuedAt(new Date())
.setExpiration(new Date(new Date().getTime() + 1000))
.signWith(SignatureAlgorithm.HS256, sign.getBytes())
.compact();
第三步:我们可以把token和用户的信息保存在我们的一个对象中通过ThreadLocal<String,Object>把所有信息都存储到我们的ThreadLocal中
第四布:可以把100块钱给了我儿子,让他去买东西
最后当请求我们服务器的时候,会携带着这个token,那么我们服务器应该怎么操作呢
我们可以继承BaseInterceptor来对请求做一个拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals(HttpMethod.OPTIONS.name())) {
return true;
}
threadLocal.set(System.currentTimeMillis());
final String authToken = request.getHeader(this.tokenHeader);
if (StringUtils.isEmpty(authToken)) {
buildFailResponse(response, "未授权的访问,token不能为空");
return false;
}
return super.preHandle(request, response, handler);
}