【问题标题】:CORS issue on Swagger UISwagger UI 上的 CORS 问题
【发布时间】:2015-09-09 13:29:10
【问题描述】:

谁能告诉我为什么会出现这些错误。

 GET http://127.0.0.1:9000/api-docs/service.json

  200 OK 4ms    swagger-ui.js (line 30261)
  Unable to Load SwaggerUI  /api-docs/ (line 83)
  Cross-Origin Request Blocked: The Same Origin Policy disallows 
  reading the remote resource at http://127.0.0.1:9000/api-
   docs/service.json. This can be fixed by moving the resource to the 
  same domain or enabling CORS.
  uncaught exception: Can't read from server. It may not have the 
 appropriate access-control-origin settings.

我正在尝试在端口 9090 上运行 Swagger UI,在 9000 上运行 Swagger API 文档,并尝试在 UI 中显示文档。

我在 API 文档服务器(端口 9000)上添加了 CORS 过滤器,如下所示。

 FilterHolder cors = swaggerUIContext.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherTyp‌ e.REQUEST)); 
cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");       
cors.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, ""); 
cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD"); 
 cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "Content-Type, api_key, Authorization"); 

firefox V33.0 中的 Request 和 Response 标头是

 Response Headers
   Content-Length   428
   Content-Type application/json

   Request Headers
     Accept application/json;charset=utf-8,*/*
     Accept-Encoding    gzip, deflate
     Accept-Language    en-US,en;q=0.5
     Connection keep-alive
     Host   localhost:9000
    Origin  http://localhost:9090
    Referer http://localhost:9090/api-docs/
     User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0)       
    Gecko/20100101 Firefox/33.0

这是我在服务器上设置 CORS 的方式

       final ResourceHandler swaggerUIResourceHandler = new ResourceHandler();
    swaggerUIResourceHandler.setResourceBase("target/classes/api-docs");
    final ServletContextHandler swaggerUIContext = new ServletContextHandler();
    swaggerUIContext.setContextPath("/api-docs");
    swaggerUIContext.setHandler(swaggerUIResourceHandler);

    FilterHolder cors = swaggerUIContext.addFilter(CrossOriginFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
    cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
    cors.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
    cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
    cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "Content-Type, api_key, Authorization");

    ServletHolder def = new ServletHolder("default", DefaultServlet.class);
    def.setInitParameter("resourceBase","./http/");
    def.setInitParameter("dirAllowed","false");
    swaggerUIContext.addServlet(def,"/");

    HandlerList handlers = new HandlerList();

handlers.setHandlers(new Handler[] { swaggerUIContext, new DefaultHandler() });
server.setHandler(handlers);

【问题讨论】:

  • 您可能想在enable-cors.orghtml5rocks.com/en/tutorials/cors 阅读有关CORS 的更多信息
  • 我确定你的 Firefox 有版本? ;-) 请使用 Firefox 的 F 工具创建网络跟踪并向我们显示标头
  • 所以您的设置没有导致设置正确的标题。你能在另一个实例上看到这些标题吗?也许你把它们放在了错误的地方。
  • 不幸的是,我对 CORS 有所了解,因此我试图让您进入正确的方向。但我不认识 Swagger,所以我们现在需要有人阅读您的问题,其中包含更多相关信息
  • 尝试将OPTIONS 添加到允许的方法列表中。另外,curl -I http://127.0.0.1:9000/api-docs/service.json 的输出是什么?

标签: swagger swagger-ui swagger-2.0


【解决方案1】:

你对 json 文件做了什么奇怪的事情吗?

我在尝试修改我的 JSON 文件并在 Chrome 上查看更改时遇到了同样的错误。确保 json 本身没有以某种方式破坏,额外的括号、逗号等。我从 swagger 现场演示中的一个示例 json 从头开始​​,我很好。我知道这是一项任务,但对我有用,至少加载了 UI!

你也可以看一下swagger ui readme,CORS support section

【讨论】:

  • 我的结果是一个损坏的 JSON 文件,我使用的是 eve-swagger,而不是使用默认的 /api-docs JSON 文件,我使用了一个包含额外字符的测试文件。感谢您的信息!
【解决方案2】:

我能够通过将以下方法添加到我的应用程序来使其工作。请注意,这也会打开 API,以便您可以接受 CrossOrigin 请求。 addMapping() 位的详细信息由您决定,但这个示例从任何地方都可以打开一切。这是完整的课程。

@SpringBootApplication
@EnableSwagger2
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Bean
  public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
      }
    };
  }
}

【讨论】:

    【解决方案3】:

    如果您使用的是 Spring Security

    请添加此代码。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        http.cors().configurationSource(request -> 
            {
                CorsConfiguration cors = new CorsConfiguration();
                    cors.setAllowedMethods(
                        Arrays.asList(HttpMethod.DELETE.name(),HttpMethod.GET.name(), HttpMethod.POST.name()));
                    cors.applyPermitDefaultValues();
                
                return cors;
            
            }).httpBasic(); 
    
    }
    

    说明:

    在上面的 CorsConfiguration 类中,我使用了两种方法。

    1. cors.applyPermitDefaultValues();

    2. cors.setAllowedMethods(请求类型名称列表);

    这个方法 cors.applyPermitDefaultValues();将允许所有主机的跨源请求。 通常此方法支持对这 3 种请求类型方法 GET、HEAD 和 PUT 的跨域支持。

    如果您的 API 公开 PUT 、 DELETE 或任何其他请求方法。然后你需要用这个 cors.setAllowedMethods(); 覆盖它

    【讨论】:

    • 请通过添加解释或 cmets(在您的代码中)来详细说明您的代码。
    • @JJJ 你现在可以检查一下,这是否足够......?
    • 是的,看起来好多了。请注意,您也可以通过将关键字放在 ``.例如,它看起来像cors.applyPermitDefaultValues();
    • @JJJ 谢谢..!!我是堆栈溢出的新手。这对我有帮助。
    【解决方案4】:

    我也遇到了这个问题,在检查了宠物商店示例中的标题后,我发现“Access-Control-Allow-Headers”需要“Content-Type、api_key、Authorization”。

    确保您拥有 api_key 以及我缺少的那个。

    【讨论】:

      【解决方案5】:

      我刚刚遇到了类似的问题:Swagger UI: HTTP Content-type "application/json" causes "Unable to Load SwaggerUI"

      尝试将 GET service.json 响应的 HTTP Content-type 标头从“application/json”更改为“text/html”,甚至将其删除。我不知道为什么,但它似乎对Swagger UI 产生了影响。

      【讨论】:

      • 更改内容类型标头没有解决问题。您能分享一下您指的是哪个特定的 Swagger 编辑器吗?
      【解决方案6】:

      对于 Springdoc OpenAPI,以下修复问题: @OpenAPIDefinition(servers = {@Server(url = "/", description = "默认服务器 URL")})

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 2017-10-08
        相关资源
        最近更新 更多