如何在 Springfox Swagger 提供的 Swagger /v2/api-docs 中启用 CORS headers?
How do I enable CORS headers in the Swagger /v2/api-docs offered by Springfox Swagger?
我的项目中有以下文件:
@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 headers。
对于我自己的控制器,我已将 @CrossOrigin
添加到控制器 类,然后那些 API 具有 CORS headers,工作正常。但是对于SwaggerJSONURL我没有自己写控制器,所以我不能使用那个注解
我已将以下方法添加到 SwaggerConfig
,如 CORS support in Spring Framework 中的 "Global CORS Configuration" 所述。
@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");
}
};
}
两个 print 语句都被打印出来,因此正在调用该方法。但是当我用 curl 调用 URL 时:
curl -H "Origin: foo.com" \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS \
--verbose \
http://localhost:9274/v2/api-docs
CORS headers 不在响应中。 (与我自己的控制器方法相反,用 @CrossOrigin
注释,其中响应确实具有 CORS headers。)
我正在使用 springfox-swagger2 版本 2.7.0,以及 spring-boot-starter-web 1.5.2。
如何在 Swagger JSON API 端点上启用 CORS headers?
我认为您需要一个通用的 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);
}
感谢@Barath 的回答。解决方案是忽略 Spring 文档,该代码似乎默默地不起作用。
(很遗憾,Spring 东西在起作用时是相当高级的,例如,"Access-Control-Allow-Headers" 响应 header 到 pre-flight 请求被设置基于 header 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
响应 header
我的项目中有以下文件:
@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 headers。
对于我自己的控制器,我已将 @CrossOrigin
添加到控制器 类,然后那些 API 具有 CORS headers,工作正常。但是对于SwaggerJSONURL我没有自己写控制器,所以我不能使用那个注解
我已将以下方法添加到 SwaggerConfig
,如 CORS support in Spring Framework 中的 "Global CORS Configuration" 所述。
@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");
}
};
}
两个 print 语句都被打印出来,因此正在调用该方法。但是当我用 curl 调用 URL 时:
curl -H "Origin: foo.com" \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS \
--verbose \
http://localhost:9274/v2/api-docs
CORS headers 不在响应中。 (与我自己的控制器方法相反,用 @CrossOrigin
注释,其中响应确实具有 CORS headers。)
我正在使用 springfox-swagger2 版本 2.7.0,以及 spring-boot-starter-web 1.5.2。
如何在 Swagger JSON API 端点上启用 CORS headers?
我认为您需要一个通用的 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);
}
感谢@Barath 的回答。解决方案是忽略 Spring 文档,该代码似乎默默地不起作用。
(很遗憾,Spring 东西在起作用时是相当高级的,例如,"Access-Control-Allow-Headers" 响应 header 到 pre-flight 请求被设置基于 header 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
响应 header