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

posted @ 2024-07-08 11:16  xd99  阅读(4)  评论(0编辑  收藏  举报