jwt工具类
public class JwtUtil {
    public static String key="mykey";
    public static String genToken(String username) {
        JWTCreator.Builder builder = JWT.create();
        Map<String, Object> headers=new HashMap<>();
        headers.put("typ","jwt");
        headers.put("alg","hs256");
        Map<String, Object> claims=new HashMap<>();
        claims.put("username",username);
        String token=builder.withHeader(headers)
                .withClaim("user",claims)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//设置失效日期,12小时后过期
                .sign(Algorithm.HMAC256(key));//加密时所用的密钥
        return token;
    }
    public static boolean parseToken(String token){
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(key))//算法HMAC256要与上面的相同,mykey也要一样
                .build();
        try{
            DecodedJWT decodedJWT = verifier.verify(token);//验证token
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}
用户接口中生成令牌
@RestController
@RequestMapping("/user")
public class UserController {
   
    @PostMapping("/login")
    public Result login(String username,String password){
        //参数校验
        //校验用户名和密码是否为5~16字符串
        if(username!=null &&StringUtils.hasLength(username) && username.length()>=5 && username.length()<=16
                && password!=null &&StringUtils.hasLength(password) && password.length()>=5 && password.length()<=16){
            //验证用户名是否存在
            //验证密码是否正确
            if("******".equals(username) && "******".equals(password)){
                //生成token
                String token = JwtUtil.genToken(username);
                return Result.success(token);
            }else{
                return Result.error("用户名或密码错误");
            }
        }else{
            return Result.error("用户名或密码长度必须在5~16范围内");
        }
    }
}
拦截器中验证令牌
@Component//拦截器放入容器中,方便WebMvcConfig注入
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        //判断请求头是否携带了token
        String token = request.getHeader("Authorization");
        if (token==null){
            //没有携带则拦截,并设置http状态码为401
            response.setStatus(401);
            return false;
        }else{
            //携带了令牌
            //验证令牌
            boolean isPass = JwtUtil.parseToken(token);
            if(isPass){
                //验证通过则放行
                return true;
            }else{
                //验证不通过也拦截
                response.setStatus(401);
                return false;
            }
        }
    }
}
注册拦截器,配置拦截哪些请求,不拦截哪些请求
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .excludePathPatterns("/user/login","/user/register");//放行登录和注册请求
    }
}
文章接口
@RestController
@RequestMapping("/article")
public class ArticleController {
    @GetMapping("/list")
    public Result list(){
        return Result.success("所有文章列表");
    }
}
测试:使用postman请求文章接口
 
 为postman的collection设置统一header
 








![路旁树木种类巡检检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]](https://i-blog.csdnimg.cn/direct/6a5693b8d2104029863455b0d63c7a96.png#pic_center)










