本篇介绍JWT token的生成和解析的基本方法
pom.xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
基本用法
public class JjwtUtil {
//秘钥
private static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String create(String id,String subject) {
String token = Jwts.builder()
.setId(id) //自定义的id
.setSubject(subject) //自定义的参数
//1小时过期
.setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000))
.signWith(key).compact();
System.out.println(token);
return token;
}
public static void parser(String token) {
Jws<Claims> claims = Jwts.parserBuilder().setSigningKey(key).build()
.parseClaimsJws(token);
System.out.println(claims.getBody().getId());
System.out.println(claims.getBody().getSubject());
}
public static void main(String args[]) throws InterruptedException {
String token = create("1","json参数");
parser(token);
create:登录成功后,调用这个方法生成token,并返回给登录者。id和subject可以设置一些你自定义的参数,subject可以是json,就相当于session中存储的一些参数一样。
parser:请求接口时,每次都要携带token,调用这个方法来验证token。如果token不合法,就会抛出异常。验证成功,就可以获取到创建token时写入的参数,如id和subject
setExpiration:设置token的过期时间,到期以后,再次验证这个token时,就会抛异常。
适用场景
单次验证:比较激活一个账号,将token发送到客户邮箱,客户激活后token即失效。可以考虑在缓存中添加和删除token参数中的id,来验证token是否使用,是否失效。
分布式:如spring的oauth2相关技术中,客户端请求服务端接口时,都集成了JWT。注意,客户端是指微服务中的客户端,而不是指客户。
不建议场景
替代session:自从前些年jwt流行以后,有很多人使用jwt来替代session。这是在盲目的追求新技术,jwt比session性能更低,安全性更差,具体差在哪,我在此不作长遍解释,网上有很多文章说明。Spring Security官方文档也明确指出,token不能用来替代session。
单点登录:使用jwt确实可以简化单点登录功能,但是这只适合一时应急用。如果要构建长期稳定良好的体系,正统的做法应该是oauth2。