引用参考:https://mp.weixin.qq.com/s/kUiZ1PcBCr1shoOg_-hmvA
使用:
SpringBoot 2.3.0
JDK 1.8
Idea2019
主要jwt的依赖:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
工具类:JWTService.java
用于生成和解析token
package com.mx.project.common.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator.Builder;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.mx.project.common.jwt.Payload;
import com.mx.project.pojo.User;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
@Component
public class JWTService {
private String secret = "secret";
private String issuer = "USERSERVICE";//发布者
private String subject = "userLoginToken";//主题
private String audience = "APP";//签名的观众 也可以理解谁接受签名的
private Map<String,String> claims;//自定义签名
/**
* 创建 hour小时后过期的Token
* @param claims
* @param hour
* @return
*/
public String createToken(Map<String,String> claims,int hour) {
Payload createPayload = this.createPayload(1);
createPayload.setClaims(claims);
Algorithm hmac256 = Algorithm.HMAC256(this.getSecret());
return createToken(createPayload,hmac256);
}
/**
* 根据负载和算法创建Token
* @param payload
* @param algorithm
* @return
*/
public String createToken(Payload payload,Algorithm algorithm) {
Builder headBuilder = createHeaderBuilder(algorithm);
Builder publicClaimbuilder = addPublicClaimBuilder(headBuilder,payload);
Builder privateClaimbuilder = addPrivateClaimbuilder(publicClaimbuilder,payload);
String token = privateClaimbuilder.sign(algorithm);
return token;
}
/**
* 创建自定小时后过期的负载
* @param hour
* @return
*/
public Payload createPayload(int hour) {
Payload payload = new Payload();
payload.setIssuer(this.getIssuer());
payload.setSubject(this.getSubject());
payload.setAudience(this.getAudience());
this.setIssuedAtAndExpiresAt(new Date(), hour, payload);
return payload;
}
/**
* 创建自定小时后过期的负载
* @param hour
* @return
*/
public Payload createPayload(String issuer, String subject, String audience, Date date,int hour) {
Payload payload = new Payload();
payload.setIssuer(issuer);
payload.setSubject(subject);
payload.setAudience(audience);
this.setIssuedAtAndExpiresAt(date, hour, payload);
return payload;
}
/**
* 添加私有声明
* @param builder
* @param payload
* @return
*/
private Builder addPrivateClaimbuilder(Builder builder, Payload payload) {
Map<String, String> claim