JWT令牌 和 拦截器的编写与注册 (配置拦截器后knife4j不能正常访问的解决办法)
首先在pom.xml引入依赖
<!--jwt坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
引入测试类
<!--单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
测试类代码
生成JWT令牌测试类代码
@Test //生成jwt令牌
public void testGen(){
// 初始化一个Map用于存储JWT的声明(claims)
Map<String,Object> claims = new HashMap<>();
// 模拟入参
claims.put("id",1);
claims.put("username","zxd");
// 创建JWT,设置用户声明、过期时间和签名算法
String token = JWT.create()
.withClaim("user",claims)// 添加载荷
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7))//添加过期时间
.sign(Algorithm.HMAC256("itzxd"));//指定算法,配置秘钥,此秘钥不可泄露
System.out.println(token);
}
解析和验证JWT令牌测试类代码
@Test //token解析
public void testParse(){
// 模拟用户传递过来的token
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6Inp4ZCJ9LCJleHAiOjE3MjEwMTI2OTZ9.xe7TEy1H7UmBxt0I-QjW1wOD43a7kFCyymnWvFyHfpc";
// 创建JWT验证器,使用HMAC256算法,密钥为"itzxd"
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("itzxd")).build();
// 使用验证器验证JWT令牌的有效性,并返回解析后的JWT对象
DecodedJWT decodedJWT = jwtVerifier.verify(token);
// 提取JWT中的声明(claims)
Map<String, Claim> claim = decodedJWT.getClaims();
// 输出声明中名为"user"的值
System.out.println(claim.get("user"));
// 如果篡改了头部和载荷部分的数据,验证失败
// 如果篡改了秘钥部分,验证失败
// token过期,验证失败
}
拦截器的编写
@Component // 将拦截器注册到IOC容器中
public class LoginInterceptor implements HandlerInterceptor {
//目标资源方法执行前执行。 返回true:放行 返回false:不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 令牌验证
String token = request.getHeader("Authorization");
// 验证token
try {
Map<String, Object> claims = JwtUtil.parseToken(token);
// 放行
return true;
} catch (Exception e) {
// 响应状态码为401
response.setStatus(401);
// 不放行
return false;
}
}
}
注册拦截器并配置不拦截路径
@Configuration // 声明是一个配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired // 注入拦截器
private LoginInterceptor loginInterceptor;
@Override // 声明重写父类的方法
public void addInterceptors(InterceptorRegistry registry) {
// 登录接口和注册接口不拦截
registry.addInterceptor(loginInterceptor) // 注册定义好的拦截器
.excludePathPatterns( // 添加不拦截路径
"/user/login", //登录页面
"/user/register" //注册页面
);
}
}
SpringBoot3登录拦截器导致不能正常访问knife4j
在拦截器下加入
"/doc.html/**", // knife4j页面
"/swagger-resources/**",
"/webjars/**",
"/v3/**"
https://blog.csdn.net/EpiphyllumLove/article/details/134231795