【问题标题】:How do I enable CORS headers in the Swagger /v2/api-docs offered by Springfox Swagger?如何在 Springfox Swagger 提供的 Swagger /v2/api-docs 中启用 CORS 标头?
【发布时间】: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 标头?

【问题讨论】:

标签: spring spring-mvc spring-boot springfox


【解决方案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 响应标头

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 2015-07-22
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2015-10-01
    • 2019-04-14
    • 2017-04-09
    • 2020-09-16
    相关资源
    最近更新 更多