本例使用了 io.jsonwebtoken 开源项目,作为 token 的实现。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.6</version>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.6</version>
<!--<scope>runtime</scope>-->
</dependency>
//设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
private static String jwtId = "miniapp";
//sub(Subject):代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
private static String jwtSubject = "tunghsing.wang";
//jwt签发者
private static String jwtIssuer = "jwt";
private static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String generateToken(Integer id) {
//Let's set the JWT Claims
JwtBuilder builder = Jwts.builder()
.setId(jwtId)
.setIssuedAt(new Date()) //iat: jwt的签发时间
.setSubject(jwtSubject)
.setIssuer(jwtIssuer)
// .setAudience("uid") //user.getid
.claim("uid",id)
.signWith(key);
//Builds the JWT and serializes it to a compact, URL-safe string
return builder.compact();
}
public static Integer parseToken(String jwt) {
try {
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(jwt).getBody();
return (Integer) claims.get("uid");
} catch (JwtException e) {
System.out.println(e);
logger.error("{}",e.getMessage());
return null;
}
}