1、 添加依赖

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>${jwt.version}</version>
</dependency>

2、先定义一个用户实体

@Data
@TableName("t_user")
public class User implements Serializable {
    @TableId("id")
    private String id;
    @TableField("t_name")
    private String tName;
    @TableField("t_pwd")
    private String tPwd;
    @TableField("t_remark")
    private String remark;
}

3、创建JWT工具类

public class JWTUtils {
    /**
     * 盐值
     */
    private static final String SING="smile";
    /**
     * 获取token
     * @param user
     * @return
     */
    public static String getToken(User user){
        Calendar instance=Calendar.getInstance();
        //令牌过期时间
        instance.add(Calendar.DATE,1);
        JWTCreator.Builder builder= JWT.create();
        builder.withClaim("userId",user.getId())
                .withClaim("userName",user.getTName());
        return builder.withExpiresAt(
                instance.getTime()).sign(Algorithm.HMAC256(SING));
    }

    /**
     * 验证token合法性 成功返回token
     * @param token
     * @return
     */
    public static DecodedJWT verify(String token) throws AfException {
        if(StringUtils.isEmpty(token)){
            throw new AfException(ExceptionEnum.JWT_ERROR);
        }
        JWTVerifier build= JWT.require(Algorithm.HMAC256(SING)).build();
        return build.verify(token);
    }
    /**
     * 获取token中的用户信息
     */
    public static DecodedJWT getTokenInfo(String token){
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

}

4、定义一个拦截器用来验证token

@Slf4j
public class JWTInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String token = request.getHeader("token");
        if(StringUtils.isEmpty(token)){
            //jwt为空,抛出异常(这里我使用自定义异常了)
            throw new AfException(ExceptionEnum.JWT_ERROR);
        }
        try {
            JWTUtils.verify(token);
        }catch (Exception e) {
            //token验证失败或到这里抛出token无效异常
            throw new AfException(ExceptionEnum.JWT_INVALID);
        }
        return true;
    }
}

5、定义一个类实现WebMvcConfigurer处理接口是否需要被拦截

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JWTInterceptor())
                //拦截的路径
                .addPathPatterns("/api/user/**")
                //排除登录接口
                .excludePathPatterns("/api/user/login","/api/user/query");
    }
}

6、验证

登陆成功会返回一个jwt字符串 image.png 调用接口时未设置token会返回报错信息提示token为空 image.png 加token后,调用成功 image.png

说点题外话,记得当时还是个菜鸟时出来找工作,当时去了给了张试卷,全是解释题,面试官说给你半个小时,可以上网查,当时我手都快写废了一半还没写完(实在是太多了),然后那人说,你回去实现一个类似jwt登陆的功能,你做好了发给hr,当时技术有限,网上找的也都运行不成功。最后不了了之了。。。