JWT工具类
mport io.jsonwebtoken.*;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;
public class JWTUtils {
private static final int TOKEN_TIME_OUT = 3_600 ;
private static final String TOKEN_ENCRY_KEY = "ABCD";
private static final int REFRESH_TIME = 300;
public static String getToken(Long id){
Map<String, Object> claimMaps = new HashMap<>();
claimMaps.put("id",id);
long currentTime = System.currentTimeMillis();
return Jwts.builder()
.setId(UUID.randomUUID().toString())
.setIssuedAt(new Date(currentTime))
.setSubject("description")
.setIssuer("xyy")
.setAudience("admin")
.compressWith(CompressionCodecs.GZIP)
.signWith(SignatureAlgorithm.HS512, generalKey())
.setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))
.addClaims(claimMaps)
.compact();
}
private static Jws<Claims> getJws(String token) {
return Jwts.parser()
.setSigningKey(generalKey())
.parseClaimsJws(token);
}
public static Claims getClaimsBody(String token) {
try {
return getJws(token).getBody();
}catch (ExpiredJwtException e){
return null;
}
}
public static JwsHeader getHeaderBody(String token) {
return getJws(token).getHeader();
}
public static int verifyToken(Claims claims) {
if(claims==null){
return 1;
}
try {
claims.getExpiration()
.before(new Date());
if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
return -1;
}else {
return 0;
}
} catch (ExpiredJwtException ex) {
return 1;
}catch (Exception e){
return 2;
}
}
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
内容打印
public class ResultTest {
public static void main(String[] args) {
String token = JWTUtils.getToken(1L);
System.out.println("根据id生成token为"+token);
JwsHeader header = JWTUtils.getHeaderBody(token);
System.out.println("头部信息"+header);
Claims body = JWTUtils.getClaimsBody(token);
System.out.println("详情信息"+body);
String exp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(body.getExpiration());
System.out.println("过期时间"+exp);
int result = JWTUtils.verifyToken(body);
System.out.println("token状态为"+result);
}
}
根据id生成token为eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQrDIBBF7zLrCI4mo8ltjGZgCm1DNZAQeveOi-4e__13w6MJLMDWBsduNhZzNuM8oUmeyfiS2TGuGCeEASQ1WJBiIDsGogHqsWpdtpo_sjd5v_qpVt3O61JOR1FO5SndbOf-z6PvuajF7w8AVTI8hQAAAA.Tkj3Dtn6Y9FhxohvQSmEU5Ze4AGaiI5NhEC2J4uDC_U3Ke6ePiOjNnWgW99jnljoOBqGh4RcbO4SZjR3lwd55w
头部信息{alg=HS512, zip=GZIP}
详情信息{jti=f0072f29-01cc-4951-a3f6-3dcf2f1b1851, iat=1687604766, sub=description, iss=xyy, aud=admin, exp=1687608366, id=1}
过期时间2023-06-24 20:06:06
token状态为-1
案例
用户登录
@Transactional
@Slf4j
@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
@Override
public ResponseResult login(LoginDto dto) {
if(StringUtils.isNotBlank(dto.getPhone())&&StringUtils.isNotBlank(dto.getPassword())){
ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
if(apUser == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"用户信息不存在");
}
String salt = apUser.getSalt();
String password = dto.getPassword();
String pwd = DigestUtils.md5DigestAsHex((password + salt).getBytes());
if(!pwd.equals(apUser.getPassword())){
return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
}
String token = AppJwtUtil.getToken(Long.valueOf(apUser.getId()));
Map<String,Object> map = new HashMap<>();
map.put("token",token);
apUser.setSalt("");
apUser.setPassword("");
map.put("user",apUser);
return ResponseResult.okResult(map);
}else {
HashMap<String, Object> map = new HashMap<>();
map.put("token",AppJwtUtil.getToken(0L));
return ResponseResult.okResult(map);
}
}
}
网关校验
@Slf4j
@Component
public class AuthorizeFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
if(request.getURI().getPath().contains("/login")){
return chain.filter(exchange);
}
String token = request.getHeaders().getFirst("token");
if(StringUtils.isBlank(token)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
try{
Claims claimsBody = AppJwtUtil.getClaimsBody(token);
int result = AppJwtUtil.verifyToken(claimsBody);
if(result==1||result==2){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
}catch(Exception e){
e.printStackTrace();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}