参考:JWT整合springboot自定义定时更换秘钥

1、定义密钥的时候,定义成public,这样后期方便修改

  1. package com.tj.utils;
  2. import com.auth0.jwt.JWT;
  3. import com.auth0.jwt.JWTCreator;
  4. import com.auth0.jwt.algorithms.Algorithm;
  5. import com.auth0.jwt.interfaces.DecodedJWT;
  6. import java.util.Calendar;
  7. import java.util.Map;
  8. public class JwtUtils {
  9. /**
  10. * jwt生成token秘钥,此处动态更新所以为空,可随便自定义
  11. */
  12. public static String SIGN = "*&5DS^33221GSO>3";
  13. /**
  14. * 生成token,header.payload.sign
  15. *
  16. * @return
  17. */
  18. public static String gettoken(Map<String, Object> map) {
  19. /**
  20. * 设置密钥
  21. */
  22. String key = SIGN;
  23. System.out.println("jwt的key = " + key);
  24. Calendar instance = Calendar.getInstance();
  25. instance.add(Calendar.DATE, 2); //默认1天过期
  26. //创建JWT builder
  27. JWTCreator.Builder builder = JWT.create();
  28. //payload
  29. map.forEach((k, v) -> {
  30. builder.withClaim(k, String.valueOf(v));
  31. });
  32. String token = builder
  33. //令牌的过期时间
  34. .withExpiresAt(instance.getTime())
  35. //sign签名
  36. .sign(Algorithm.HMAC256(key));
  37. return token;
  38. }
  39. /**
  40. * 验证token
  41. *
  42. * @param token 返回DecodedJWT对象,包含token信息
  43. * @return
  44. */
  45. public static DecodedJWT checktoken(String token) {
  46. /**
  47. * 设置密钥
  48. */
  49. //创建验证对象
  50. return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
  51. }
  52. }

2、每次项目启动的时候,更换一次密钥

参考:Springboot 仅在项目启动时执行一次

项目启动时,可以调用一次

  1. package com.tj.config;
  2. import com.tj.utils.JwtUtils;
  3. import com.tj.utils.TjStringUtils;
  4. import org.springframework.boot.ApplicationArguments;
  5. import org.springframework.boot.ApplicationRunner;
  6. import org.springframework.stereotype.Component;
  7. @Component
  8. public class Runner implements ApplicationRunner {
  9. @Override
  10. public void run(ApplicationArguments args) throws Exception {
  11. System.out.println("=======项目启动,初始化执行1次---开始=======");
  12. //动态生成key密钥,并保存
  13. JwtUtils.SIGN = TjStringUtils.generateNonceStr(10);
  14. System.out.println("=======项目启动,初始化执行1次---结束=======");
  15. }
  16. }

3、实现强制全员下线的操作

通过更新密钥,这样就可以让全员下线

  1. package com.tj.system.controller;
  2. import com.tj.utils.JwtUtils;
  3. import com.tj.utils.R;
  4. import com.tj.utils.TjStringUtils;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.web.bind.annotation.*;
  7. @Slf4j //日志
  8. @RestController //RESTful风格写法
  9. @RequestMapping("/jwt") //定义API接口
  10. public class JwtSignCtrl {
  11. /**
  12. * 强制下线,即修改JWT密钥
  13. *
  14. * @return
  15. */
  16. @PostMapping
  17. public R<String> allOffLine() {
  18. JwtUtils.SIGN = TjStringUtils.generateNonceStr(10);
  19. return R.success("JWT密钥修改成功");
  20. }
  21. }