1、定义密钥的时候,定义成public,这样后期方便修改
package com.tj.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Map;
public class JwtUtils {
/**
* jwt生成token秘钥,此处动态更新所以为空,可随便自定义
*/
public static String SIGN = "*&5DS^33221GSO>3";
/**
* 生成token,header.payload.sign
*
* @return
*/
public static String gettoken(Map<String, Object> map) {
/**
* 设置密钥
*/
String key = SIGN;
System.out.println("jwt的key = " + key);
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 2); //默认1天过期
//创建JWT builder
JWTCreator.Builder builder = JWT.create();
//payload
map.forEach((k, v) -> {
builder.withClaim(k, String.valueOf(v));
});
String token = builder
//令牌的过期时间
.withExpiresAt(instance.getTime())
//sign签名
.sign(Algorithm.HMAC256(key));
return token;
}
/**
* 验证token
*
* @param token 返回DecodedJWT对象,包含token信息
* @return
*/
public static DecodedJWT checktoken(String token) {
/**
* 设置密钥
*/
//创建验证对象
return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
}
2、每次项目启动的时候,更换一次密钥
项目启动时,可以调用一次
package com.tj.config;
import com.tj.utils.JwtUtils;
import com.tj.utils.TjStringUtils;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class Runner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("=======项目启动,初始化执行1次---开始=======");
//动态生成key密钥,并保存
JwtUtils.SIGN = TjStringUtils.generateNonceStr(10);
System.out.println("=======项目启动,初始化执行1次---结束=======");
}
}
3、实现强制全员下线的操作
通过更新密钥,这样就可以让全员下线
package com.tj.system.controller;
import com.tj.utils.JwtUtils;
import com.tj.utils.R;
import com.tj.utils.TjStringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Slf4j //日志
@RestController //RESTful风格写法
@RequestMapping("/jwt") //定义API接口
public class JwtSignCtrl {
/**
* 强制下线,即修改JWT密钥
*
* @return
*/
@PostMapping
public R<String> allOffLine() {
JwtUtils.SIGN = TjStringUtils.generateNonceStr(10);
return R.success("JWT密钥修改成功");
}
}