java小菜机一枚 2023-09-27 14:09 采纳率: 91.3%
浏览 10
已结题

springboot拦截器的问题

springboot拦截器的问题

我做了一个路径不对重定向到/404路径,但是我的拦截器中会判断token,它会先执行到拦截器里面,我这些不对的路径就不想执行判断token的逻辑,我想到的是把所有能访问的路径写出来判断当前访问的路径是不是能访问的路径,但是感觉那样写不太好,有没有什么更好的方法?
webconfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RequestInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/member/login");
    }

}

errorconfig

@Component
public class ErrorConfig implements ErrorPageRegistrar {

    @Override
    public void registerErrorPages(ErrorPageRegistry registry) {
        ErrorPage resourceNotFound = new ErrorPage(HttpStatus.NOT_FOUND,"/404");
        ErrorPage accessDenied = new ErrorPage(HttpStatus.UNAUTHORIZED,"/401");
        ErrorPage beAttacked = new ErrorPage(HttpStatus.BAD_GATEWAY,"/502");
        ErrorPage serverDown = new ErrorPage(HttpStatus.SERVICE_UNAVAILABLE,"/503");
        registry.addErrorPages(resourceNotFound,accessDenied,beAttacked,serverDown);
    }

}

拦截器

@Slf4j
public class RequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        if (StringUtil.isEmpty(token)) {
            throw new CustomException(ResultEnum.notTokenError.getCode(),ResultEnum.notTokenError.getMessage());
        }
        try {
            JwtUtil.verify(token);
        } catch (TokenExpiredException tee) {
            throw new CustomException(ResultEnum.tokenOverdue.getCode(),ResultEnum.tokenOverdue.getMessage());
        } catch (SignatureVerificationException sve) {
            throw new CustomException(ResultEnum.tokenSignatureError.getCode(),ResultEnum.tokenSignatureError.getMessage());
        } catch (InvalidClaimException ice) {
            throw new CustomException(ResultEnum.invalidToken.getCode(),ResultEnum.invalidToken.getMessage());
        } catch (AlgorithmMismatchException ame) {
            throw new CustomException(ResultEnum.tokenAlgorithmicError.getCode(),ResultEnum.tokenAlgorithmicError.getMessage());
        } catch (JWTDecodeException jde) {
            throw new CustomException(ResultEnum.tokenException.getCode(),ResultEnum.tokenException.getMessage());
        }
        String requestUri = request.getRequestURI();
        log.info("requestUri:{}", requestUri);
        return true;
    }

}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-27 14:13
    关注

    该回复引自免费微信小程序-皆我百晓生:


    对于您的问题,可以使用Ant风格的路径匹配来避免在拦截器中执行不必要的逻辑。您可以在WebConfig中修改excludePathPatterns的配置,使用通配符来排除其他不需要进行token判断的路径。例如:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new RequestInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/member/login")
                    .excludePathPatterns("/public/**"); // 排除以 /public/ 开头的路径
        }
    
    }
    

    在您的拦截器中,可以获取当前请求的路径,并检查是否以/public/开头来判断是否需要执行token判断的逻辑。例如:

    public class RequestInterceptor implements HandlerInterceptor {
    
        private static final String PUBLIC_PATH_PREFIX = "/public/";
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String token = request.getHeader("token");
            String requestUri = request.getRequestURI();
            
            if (!requestUri.startsWith(PUBLIC_PATH_PREFIX)) {
                // 执行token判断的逻辑
                if (StringUtil.isEmpty(token)) {
                    throw new CustomException(ResultEnum.notTokenError.getCode(), ResultEnum.notTokenError.getMessage());
                }
                try {
                    JwtUtil.verify(token);
                } catch (TokenExpiredException tee) {
                    throw new CustomException(ResultEnum.tokenOverdue.getCode(),ResultEnum.tokenOverdue.getMessage());
                } catch (SignatureVerificationException sve) {
                    throw new CustomException(ResultEnum.tokenSignatureError.getCode(),ResultEnum.tokenSignatureError.getMessage());
                } catch (InvalidClaimException ice) {
                    throw new CustomException(ResultEnum.invalidToken.getCode(),ResultEnum.invalidToken.getMessage());
                } catch (AlgorithmMismatchException ame) {
                    throw new CustomException(ResultEnum.tokenAlgorithmicError.getCode(),ResultEnum.tokenAlgorithmicError.getMessage());
                } catch (JWTDecodeException jde) {
                    throw new CustomException(ResultEnum.tokenException.getCode(),ResultEnum.tokenException.getMessage());
                }
            }
            
            log.info("requestUri:{}", requestUri);
            return true;
        }
    
    }
    

    通过这种方式,您可以添加更多排除路径的规则,而不需要列出所有能访问的路径。同时,对于其他不需要进行token判断的路径,您可以定义一个公共路径前缀(例如/public/),以简化逻辑判断。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月5日
  • 已采纳回答 9月27日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 C++ 菜单窗口独立出来,可以随意移动放大缩小。
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?