- 下面是properties配置内容
#JWT 密钥
jwt.secretKey=xxxxxfdsfxxx
jwt.accessTokenExpireTime= PT2H
jwt.refreshTokenExpireTime= P30D
jwt.issuer=yingxue.com
- 首先这样子注入是行不通的是获取不到值的
public class JwtTokenUtil {
@Value("${jwt.secretKey}")
private static String secretKey;
@Value("${jwt.accessTokenExpireTime}")
private static Duration accessTokenExpireTime;
@Value("${jwt.refreshTokenExpireTime}")
private static Duration refreshTokenExpireTime;
@Value("${jwt.issuer}")
private static String issuer;
/**
* 生成 access_token
* @Author: 小霍
* @CreateDate: 2019/9/26 10:22
* @UpdateUser:
* @UpdateDate: 2019/9/26 10:22
* @Version: 0.0.1
* @param subject
* @param claims
* @return java.lang.String
* @throws
*/
public static String getAccessToken(String subject,Map<String,Object> claims){
return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
}
/**
* 签发token
* @Author: 小霍
* @CreateDate: 2019/9/7 20:42
* @UpdateUser:
* @UpdateDate: 2019/9/7 20:42
* @Version: 0.0.1
* @param issuer 签发人
* @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
* @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
* @param ttlMillis 有效时间(毫秒)
* @return java.lang.String
* @throws
*/
public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);
JwtBuilder builder = Jwts.builder();
if(null!=claims){
builder.setClaims(claims);
}
if (!StringUtils.isEmpty(subject)) {
builder.setSubject(subject);
}
if (!StringUtils.isEmpty(issuer)) {
builder.setIssuer(issuer);
}
builder.setIssuedAt(now);
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
builder.signWith(signatureAlgorithm, signingKey);
return builder.compact();
}
}
- 们可以改成这样
@Component
public class JwtTokenUtil {
private static String secretKey;
private static Duration accessTokenExpireTime;
private static Duration refreshTokenExpireTime;
private static String issuer;
@Value("${jwt.secretKey}")
public void setSecretKey(String secretKey){
secretKey=secretKey;
}
@Value("${jwt.accessTokenExpireTime}")
public void setAccessTokenExpireTime(Duration accessTokenExpireTime){
accessTokenExpireTime=accessTokenExpireTime;
}
@Value("${jwt.refreshTokenExpireTime}")
public void setRefreshTokenExpireTime(Duration refreshTokenExpireTime){
refreshTokenExpireTime=refreshTokenExpireTime;
}
@Value("${jwt.issuer}")
public void setIssuer(String issuer){
issuer=issuer;
}
/**
* 生成 access_token
* @Author: 小霍
* @CreateDate: 2019/9/26 10:22
* @UpdateUser:
* @UpdateDate: 2019/9/26 10:22
* @Version: 0.0.1
* @param subject
* @param claims
* @return java.lang.String
* @throws
*/
public static String getAccessToken(String subject,Map<String,Object> claims){
return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
}
/**
* 签发token
* @Author: 小霍
* @CreateDate: 2019/9/7 20:42
* @UpdateUser:
* @UpdateDate: 2019/9/7 20:42
* @Version: 0.0.1
* @param issuer 签发人
* @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
* @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
* @param ttlMillis 有效时间(毫秒)
* @return java.lang.String
* @throws
*/
public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);
JwtBuilder builder = Jwts.builder();
if(null!=claims){
builder.setClaims(claims);
}
if (!StringUtils.isEmpty(subject)) {
builder.setSubject(subject);
}
if (!StringUtils.isEmpty(issuer)) {
builder.setIssuer(issuer);
}
builder.setIssuedAt(now);
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
builder.signWith(signatureAlgorithm, signingKey);
return builder.compact();
}
}
- 我们还可以改成这样用代理来初始化
- 创建一个javaBean 注入配置信息
@Configuration
@ConfigurationProperties(prefix = "jwt")
@Data
public class TokenSettings {
private String secretKey;
private Duration accessTokenExpireTime;
private Duration refreshTokenExpireTime;
private String issuer;
}
- 修改 JwtTokenUtil
@Slf4j
public class JwtTokenUtil {
private static String secretKey;
private static Duration accessTokenExpireTime;
private static Duration refreshTokenExpireTime;
private static String issuer;
public static void setTokenSettings(TokenSettings tokenSettings){
secretKey=tokenSettings.getSecretKey();
accessTokenExpireTime=tokenSettings.getAccessTokenExpireTime();
refreshTokenExpireTime=tokenSettings.getRefreshTokenExpireTime();
issuer=tokenSettings.getIssuer();
}
/**
* 生成 access_token
* @Author: 小霍
* @CreateDate: 2019/9/26 10:22
* @UpdateUser:
* @UpdateDate: 2019/9/26 10:22
* @Version: 0.0.1
* @param subject
* @param claims
* @return java.lang.String
* @throws
*/
public static String getAccessToken(String subject,Map<String,Object> claims){
return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
}
/**
* 生产 refresh_token
* @Author: 小霍
* @CreateDate: 2019/9/26 10:24
* @UpdateUser:
* @UpdateDate: 2019/9/26 10:24
* @Version: 0.0.1
* @param subject
* @param claims
* @return java.lang.String
* @throws
*/
public static String getRefreshToken(String subject,Map<String,Object> claims){
return generateToken(issuer,subject,claims,refreshTokenExpireTime.toMillis(),secretKey);
}
/**
* 签发token
* @Author: 小霍
* @CreateDate: 2019/9/7 20:42
* @UpdateUser:
* @UpdateDate: 2019/9/7 20:42
* @Version: 0.0.1
* @param issuer 签发人
* @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
* @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
* @param ttlMillis 有效时间(毫秒)
* @return java.lang.String
* @throws
*/
public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);
JwtBuilder builder = Jwts.builder();
if(null!=claims){
builder.setClaims(claims);
}
if (!StringUtils.isEmpty(subject)) {
builder.setSubject(subject);
}
if (!StringUtils.isEmpty(issuer)) {
builder.setIssuer(issuer);
}
builder.setIssuedAt(now);
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
builder.signWith(signatureAlgorithm, signingKey);
return builder.compact();
}
}
- 创建一个代理类直接初始化静态变量
@Component
public class StaticInitializerUtil {
private TokenSettings tokenSettings;
public StaticInitializerUtil(TokenSettings tokenSettings) {
JwtTokenUtil.setTokenSettings(tokenSettings);
}