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字符串 调用接口时未设置token会返回报错信息提示token为空 加token后,调用成功
说点题外话,记得当时还是个菜鸟时出来找工作,当时去了给了张试卷,全是解释题,面试官说给你半个小时,可以上网查,当时我手都快写废了一半还没写完(实在是太多了),然后那人说,你回去实现一个类似jwt登陆的功能,你做好了发给hr,当时技术有限,网上找的也都运行不成功。最后不了了之了。。。