如何在 Springfox Swagger 提供的 Swagger /v2/api-docs 中启用 CORS 标头?
Posted
技术标签:
【中文标题】如何在 Springfox Swagger 提供的 Swagger /v2/api-docs 中启用 CORS 标头?【英文标题】:How do I enable CORS headers in the Swagger /v2/api-docs offered by Springfox Swagger? 【发布时间】:2018-01-22 10:35:53 【问题描述】:我的项目中有以下文件:
@Configuration
@Order(Ordered.LOWEST_PRECEDENCE)
public class SwaggerConfig
@Bean
public Docket apiSwagger2Documentation() ....
在Application.java中有:
@SpringBootApplication
@ComponentScan(basePackages = ... )
@EnableSwagger2
public class Application
...
Swagger JSON 在/v2/api-docs
下可用,效果很好。
我想做的是为该端点启用 CORS 标头。
对于我自己的控制器,我已将 @CrossOrigin
添加到控制器类中,这些 API 然后具有 CORS 标头,效果很好。但是对于 Swagger JSON URL,我自己没有写控制器,所以我不能使用那个注解。
我在SwaggerConfig
中添加了以下方法,如CORS support in Spring Framework 中的“全局CORS 配置”中所述。
@Bean
public WebMvcConfigurer corsConfigurer()
System.out.println("*** corsConfigurer called");
return new WebMvcConfigurerAdapter()
@Override public void addCorsMappings(CorsRegistry registry)
System.out.println("*** addCorsMappings called");
registry.addMapping("/v2/api-docs");
;
两个打印语句都被打印,所以方法被调用。但是当我用 curl 调用 URL 时:
curl -H "Origin: foo.com" \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS \
--verbose \
http://localhost:9274/v2/api-docs
响应中没有 CORS 标头。 (与我自己的控制器方法相比,使用 @CrossOrigin
注释,其中响应确实具有 CORS 标头。)
我使用的是 springfox-swagger2 2.7.0 版和 spring-boot-starter-web 1.5.2。
如何在 Swagger JSON API 端点上启用 CORS 标头?
【问题讨论】:
您是否尝试过按照此处***.com/questions/32084925/… 的描述包含简单的 CORSFilter? grokbase.com/t/gg/swagger-swaggersocket/1579hd7hzy/… @surya - 感谢您的链接,但我的问题是关于 /v2/api-docs 中的 Swagger JSON 文件,而不是 swagger-ui(我没有使用 swagger-ui)。 【参考方案1】:我认为您需要一个通用的 Web 过滤器,而不是 Web Mvc 配置。
@Bean
public CorsFilter corsFilter()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// Allow anyone and anything access. Probably ok for Swagger spec
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/v2/api-docs", config);
return new CorsFilter(source);
【讨论】:
我在哪里可以得到对象jHipsterProperties
?我没有使用 JHipster。只是 Spring Boot,带有 Spring REST,Springfox Swagger 提供 /v2/api-docs
URL。
@AdrianSmith 抱歉,我塞满了粘贴。修正了答案。查看更新。
谢谢,这是一种享受 :) 昨天整个下午都花在了这个上面。谢谢!最后我用了new CorsConfiguration().applyPermitDefaultValues()
。
我在哪里可以添加这个配置?
@user545871 任何带有@Configuration
注释的配置类【参考方案2】:
感谢@Barath 的回答。解决方案是忽略 Spring 文档,该代码似乎默默地不起作用。
(很遗憾,Spring 的东西在工作时非常先进,例如,飞行前请求的“Access-Control-Allow-Headers”响应标头是根据 Java API 方法的标头设置的实际提供。)
忽略 Spring 的 CORS 实现并自己做。我把对我有用的代码放在这里:
@Component
public class CorsFilter implements Filter
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "Foo, Bar, Baz");
chain.doFilter(req, res);
@Override
public void init(FilterConfig filterConfig)
@Override
public void destroy()
记得将您在任何 REST 方法中使用过的任何 @RequestHeader
添加到 Access-Control-Allow-Headers
响应标头
【讨论】:
以上是关于如何在 Springfox Swagger 提供的 Swagger /v2/api-docs 中启用 CORS 标头?的主要内容,如果未能解决你的问题,请参考以下文章
在springboot中整合jersey和springfox-swagger2
Springfox与SpringDoc——swagger如何选择(SpringDoc入门)
如何使用 Springfox 从 Swagger 文档中隐藏端点