- 导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 自定义JWT工具类
package com.sdmc.open.api.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@RefreshScope
@Component
public class JwtTokenUtil {
private static final String CLAIM_KEY_SUBJECT = "sub";
private static final String CLAIM_KEY_CREATED = "created";
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
@Value("${jwt.tokenHead}")
private String tokenHead;
public String generateToken(Map<String,Object> claims){
return Jwts.builder().setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512,secret)
.compact();
}
private String parseToken(String jwt) {
return Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(jwt)
.getBody()
.getSubject();
}
public Claims getClaimsFromToken(String token){
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
public boolean validateToken(String token){
try {
parseToken(token);
if(isTokenExpired(token)){
return false;
}
}catch (Exception e){
return false;
}
return true;
}
private boolean isTokenExpired(String token){
Date expiredDate = getExpiredDateFromToken(token);
return expiredDate.before(new Date());
}
public Date getExpiredDateFromToken(String token){
return getClaimsFromToken(token).getExpiration();
}
public String refreshHeadToken(String oldToken) {
if(StringUtils.isEmpty(oldToken)){
return null;
}
String token = oldToken.substring(tokenHead.length());
if(StringUtils.isEmpty(token)){
return null;
}
Claims claims = getClaimsFromToken(token);
if(claims==null){
return null;
}
if(isTokenExpired(token)){
return null;
}
if(tokenRefreshJustBefore(token,30*60)){
return token;
}else{
claims.put(CLAIM_KEY_CREATED, new Date());
return generateToken(claims);
}
}
private boolean tokenRefreshJustBefore(String token, int time) {
Claims claims = getClaimsFromToken(token);
Date created = claims.get(CLAIM_KEY_CREATED, Date.class);
Date refreshDate = new Date();
Calendar instance = Calendar.getInstance();
instance.setTime(created);
instance.add(Calendar.SECOND,time);
if(refreshDate.after(created) && refreshDate.before(instance.getTime())){
return true;
}
return false;
}
}
- 更新配置文件
#JWT
jwt.secret=xvYnOL6Bp5xM/mQGF11gd7k1/dKfS8/J
jwt.expiration=6000
jwt.tokenHead=openApi