项目common-web中,FilterConfig中指定了拦截器,对接口进行权限,用户信息等校验。会对所有url进行拦截,包含swagger的url。但正常情况下,需要不对swagger拦截。
registration.excludePathPatterns(whiteListConfig.getUrl())
可以设置url白名单,这里需要在项目的配置文件(yml或properties)中加入如下配置:
# 设置白名单,拦截器直接放行 whitelist: url: - "/swagger-ui.html" - "/webjars/springfox-swagger-ui/**" - "/swagger-resources/**" - "/v2/api-docs"
但是如果白名单只配置“/swagger-ui.html”的情况下,对js,css等放行,没有被拦截,png却拦截了,当白名单配置“/webjars/springfox-swagger-ui/**”就可以了(拦截规则待确定,js,css按道理也是会被拦截的)
“v2/api-docs”为swagger在项目启动后,自动生成的json格式的rest api文档,如下图所示
swagger-ui.html展示的数据根据api-docs解析出来的,所以也需要对其进行放行。
“/swagger-resources”用来获取api-docs的URI,所以也放行。
这样就可以继续通过swagger进行接口调用。
注意:经实践,拦截器会在资源映射之前,也就是说拦截器会对有url拦截(除过白名单),然后再去进行资源映射。比如,如果拦截器白名单中没有“/static/**”的情况下,localhost:8080/static/app.js 也会进拦截器,然后再去ResourceHandler资源映射匹配。所以我们的swagger-ui一定需要先配置拦截器白名单。然后看情况是否需要配置资源映射。该项目中我们不需要在重写WebMvcConfigurer的addResourceHandlers方法中加入swagger资源的配置了,如下
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); // 如下两项配置可以省去 registry.addResourceHandler("/swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); }
swagger-ui.html及相关静态资源位于 springfox-swagger-ui jar 包中的META-INF/resources/目录下,项目编译后swagger-ui.html将添加到classpath的/META-INF/resources/下,因为WebMVC默认配置了“/META-INF/resources/”,所以不需要上述那样再配置静态资源映射(在Servlet3协议规范中,包含在JAR文件/META-INFO/resources/路径下的资源可以直接访问,无需配置静态资源映射)
发表评论