记一次自定义拦截器拦截/v2/api-docs失效的问题排查

项目场景:

项目中使用swagger来自动生成接口文档,为了防止接口文档地址在外网被访问,需要对swagger的静态资源链接以及动态接口请求根据host属性做一些处理,使得外网域名不能访问接口文档地址。一个容易想到的办法就是通过Spring的Interceptor来实现,在preHandle方法中对swagger的请求路径做拦截。


问题描述

SwaggerInterceptor可以拦截到/swagger-ui.html请求,但是始终无法拦截/v2/api-docs接口,用户还是可以通过直接访 /v2/api-docs获取所有接口的json格式信息。

@Configuration
public class CorsConfig implements WebMvcConfigurer {


    @Bean
    public AuthInterceptor authInterceptor() {
        return new AuthInterceptor();
    }
    

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor())
                // 拦截所有请求
                .addPathPatterns("/**");
    }
}

原因分析:

首先,检查拦截器的配置,发现AuthInterceptor配置是拦截全部请求addPathPatterns(“/**”),并且可以拦截到/swagger-ui.html,确认不是拦截器全局配置的问题。

解决方案:

既然自定的HanderMapping初始化未绑定拦截器,导致拦截器失效,那我们换一种思路,通过ResponseBodyAdvice配合@ControllerAdvice注解,在请求响应体返回之前,校验请求URL,若为外网请求的Swagger路径,进行拦截。

@RestControllerAdvice
public class SwaggerAdvice implements ResponseBodyAdvice {

    private static final List<String> EXCLUDE_URL = Arrays.asList("/v2/api-docs");

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        String url = serverHttpRequest.getURI().getHost() + serverHttpRequest.getURI().getPath();
        if (EXCLUDE_URL.stream().anyMatch(item -> url.contains(item))) {
            serverHttpResponse.setStatusCode(HttpStatus.FORBIDDEN);
            throw new BusinessException("鉴权失败,该行为未授权,暂无权访问");
        }
        return o;
    }

    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }
}

结果:

至此,可以做到拦截/v2/api-docs接口的外网请求
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要通过代码动态关闭Swagger的/v2/api-docs端点,可以使用Spring Boot的`WebMvcConfigurer`接口来实现。您可以创建一个类,实现`WebMvcConfigurer`接口,并覆盖`addResourceHandlers`方法。在这个方法中,您可以添加一个拦截器,用于阻止对/v2/api-docs的访问。以下是一个示例代码: ``` @Configuration @EnableWebMvc public class SwaggerConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false) .addResolver(new PathResourceResolver() { @Override protected Resource getResource(String resourcePath, Resource location) throws IOException { Resource requestedResource = location.createRelative(resourcePath); return requestedResource.exists() && requestedResource.isReadable() ? requestedResource : new ClassPathResource("/META-INF/resources/webjars/springfox-swagger-ui/index.html"); } }); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getRequestURI().equals("/v2/api-docs")) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return false; } return true; } }); } } ``` 在这个示例中,`addResourceHandlers`方法用于配置Swagger UI的资源处理器,`addInterceptors`方法用于添加一个拦截器,用于阻止对/v2/api-docs的访问。这个拦截器会检查请求的URI是否为/v2/api-docs,如果是,则返回404错误。通过这种方式,就可以在代码中动态关闭Swagger的/v2/api-docs端点了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值