1.token是带过期时间的密钥,可以用来做用户校验,登陆有效期
2.添加jwt依赖
3.生成加密字符串,创建map,存入自定义key,value.存入当前时间和过期时间。生成token
4.传入用来加密的字符串。传入token。可以获得解析后的Jws
,从中get到body,取出存进去的map
token的生成与解析,有jjwt组件与auth0组件支持生成解析token.
jjwt:json web token,用在web或android开发中的一个生成token的组件
格式:
header.body.密文
{“alg”:“HS256”}.{“userid”:“11”,“createTime”:“12312312312312”,“endTime”:213123123123}.{密文}
依赖
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-apiartifactId>
<version>${jjwt.version}version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-implartifactId>
<version>${jjwt.version}version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-jacksonartifactId>
<version>${jjwt.version}version>
dependency>
基于HS256生成复杂密钥
SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
String encode = Encoders.BASE64.encode(secretKey.getEncoded());
System.out.println(encode);
开始生成token,把生成的密钥闯进生成token的jwt中
Map<String, Object> m = new HashMap<>(10);
m.put("id", 1);
Date date = new Date();
long time = date.getTime();
SecretKey test = Keys.hmacShaKeyFor(Decoders.BASE64.decode("89m/fnWuAs3SjWrabAdNRZhWtp6+auFFypvs+cHmd/w="));
//设置签名(加密原型)时间戳,过期时间
String compact = Jwts.builder()
.addClaims(m)
.setIssuedAt(date)
.setExpiration(new Date(date.getTime() + 60 * 60*1000))
.signWith(test).compact();
System.out.println(compact);
解析token
Key test = Keys.hmacShaKeyFor(Decoders.BASE64.decode("89m/fnWuAs3SjWrabAdNRZhWtp6+auFFypvs+cHmd/w="));
Jws<Claims> claimsJws = Jwts.parserBuilder().setSigningKey(test).build().parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiaWF0IjoxNjYzNjczMTk4LCJleHAiOjE2NjM2NzY3OTh9.SqZGseChOeY3fIJJrhYA3t07R0uOpyf9VOZH8RLnMHA");
Integer id = claimsJws.getBody().get("id", Integer.class);
System.out.println(claimsJws.getHeader());
System.out.println(claimsJws.getSignature());
System.out.println(id); //ExpiredJwtException
登陆token思路
登陆成功(即通过用户名密码在数据库查询到用户后),生成token。添加到响应头中。
前端在 响应后拦截中获取到响应头中的token,并存储到localstorage中(永久有效,也可以放到cookie或session中,一次会话有效)。
前端 在请求前拦截中 获取到localstorage中存储的token,并统一配到请求头中(所有请求请求头都包含token)
后端在登陆拦截器 前拦截方法中获取请求头中的token,并对其进行校验(校验结果:空,过期,不对照,正确)
正确查缓存(缓存中存的有token,并且有效时间比原token多两分钟)