SpringBoot集成Jwt(详细步骤+图解)

时间:2025-03-19 08:20:28
创建TokenUtils(生成/验证)工具类
package ;
import ;
import ;
import com.;
import com.;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
 
@Component
public class TokenUtils {
 
    private static IUserService staticUserService;
    @Autowired
    private IUserService userService;
 
    @PostConstruct
    public void setUserService(){
        staticUserService = userService;
    }
 
    //生成token
    public static String genToken(String userId, String sign) {
        return ().withAudience(userId) // 将 user id 保存到 token 里面,作为载荷
                .withExpiresAt((new Date(), 2)) // 2小时后token过期
                .sign(Algorithm.HMAC256(sign)); // 以 password 作为 token 的密钥
 
 
    }
    //获取当前用户对象信息
    public static User getCurrentUser(){
        try {
            HttpServletRequest request = ((ServletRequestAttributes) ()).getRequest();
 
            String token = ("token");
            if ((token)){
 
                String userId = (token).getAudience().get(0);
                return ((userId));
            }
        } catch (Exception e) {
            return null;
        }
 
       return null;
 
    }
}
创建Jwt拦截器 JwtInterceptor(拦截所有请求验证token)
package ;
import ;
import com.;
import com.;
import com.;
import com.;
import com.;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
 
public class JwtInterceptor implements HandlerInterceptor {
    @Autowired
    private IUserService userService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)   {
        String token = ("token");
        //如果不映射到方法直接通过
        if(!(handler instanceof HandlerMethod)){
            return true;
        }
        // 执行认证
        if ((token)) {
            throw new ServiceException(Constants.CODE_401, "无token,请重新登录");
        }
        // 获取 token 中的userId
        String userId;
        try {
            userId = (token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            throw new ServiceException(Constants.CODE_401, "token验证失败");
        }
        //根据token中的userid查询数据库
        User user = (userId);
        if (user == null) {
            throw new ServiceException(Constants.CODE_401, "用户不存在,请重新登录");
        }
        // 用户密码加签验证 token
        JWTVerifier jwtVerifier = (Algorithm.HMAC256(())).build();
       try{
           (token); // 验证token
    } catch (JWTVerificationException e) {
        throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录");
    }
        return true;
    }
}
将拦截器注入到SpirngMVC
package ;
import ;
import ;
import ;
import ;
import ;
 
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
      @Override
      public void addInterceptors (InterceptorRegistry registry){
        (jwtInterceptor())
                .addPathPatterns("/**") //拦截所有请求,通过判断token是否合法来决定是否需要登录
                .excludePathPatterns("/user/login","/user/register");
 
      }
      @Bean
      public JwtInterceptor jwtInterceptor(){
          return new JwtInterceptor();
      }
}
创建Controller进行测试
package ;
 
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .*;
import ;
import ;
import ;
import ;
import ;
 
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zuozhe
 * @since 2023-01-12
 */
@RestController
@RequestMapping("/user")
public class UserController {
    //写逻辑代码生成
    @Resource
    private IUserService userService;
 
    //登录
    @PostMapping("/login")
    public Result login(@RequestBody UserDTO userDTO) {
        String username = ();
        String password = ();
        if ((username) || (password)){
            return (Constants.CODE_400,"参数错误");
        }
        UserDTO dto = (userDTO);
        return  (dto);
    }
 
    //注册
    @PostMapping("/register")
    public Result register(@RequestBody UserDTO userDTO) {
        String username = ();
        String password = ();
        if ((username) || (password)){
            return (Constants.CODE_400,"参数错误");
        }
        return ((userDTO));
    }
 
 
    //新增或者更新
    @PostMapping
    public boolean save(@RequestBody User user) {
            return (user);
            }
 
    //删除数据
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id) {
            return (id);
            }
 
    //查询所有数据
    @GetMapping
    public List<User> findAll() {
            return ();
            }
 
    //根据id查询
    @GetMapping("/id")
    public User findOne(@PathVariable Integer id) {
            return (id);
            }
 
    //个人信息补充
    @GetMapping("/username/{username}")
    public User findOne(@PathVariable String username) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        ("username",username);
        return (queryWrapper);
    }
 
 
    //分页查询
    @GetMapping("/page")
    public Page<User> findPage(@RequestParam Integer pageNum,
                               @RequestParam Integer pageSize,
                               @RequestParam(defaultValue = "")String username,
                               @RequestParam(defaultValue = "")String phone,
                               @RequestParam(defaultValue = "")String buildingId){
 
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if (!"".equals(username)){
            ("username",username);
        }
        if (!"".equals(phone)){
            ("phone",phone);
        }
        if (!"".equals(buildingId)){
            ("building_id",buildingId);
        }
        //获取当前用户信息
        User currentUser = ();
        (());
        return (new Page<> (pageNum , pageSize),queryWrapper);
    }
 
}
(注:有一些增删改查的业务可忽略)