【问题标题】:CORS error when accessing static resource访问静态资源时出现 CORS 错误
【发布时间】:2019-06-28 17:16:13
【问题描述】:

尽管有以下配置,但访问 http://localhost:8080/rooms/rooms.json 会给我一个 CORS 错误 - 请求的资源上不存在“Access-Control-Allow-Origin”标头

我可以请求控制器映射的任何其他路径。静态资源有什么问题?如何在没有 spring security 的情况下允许 cors 请求或排除资源路径?

Spring Boot 2.0.5

Spring Boot Web Starter 2.0.5

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/rooms/**")
                .addResourceLocations("classpath:/rooms/")
                .setCachePeriod(3600)
                .resourceChain(true)
                .addResolver(new PathResourceResolver());
    }
    @Override
    public void addCorsMappings(final CorsRegistry registry) {
        registry.addMapping("/**");
    }

}

【问题讨论】:

  • 响应的 HTTP 状态码是什么?

标签: spring spring-boot cors


【解决方案1】:

像下面这样更新addCorsMappings 就可以了

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
   @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/rooms/**")
            .addResourceLocations("classpath:/rooms/")
            .setCachePeriod(3600)
            .resourceChain(true)
            .addResolver(new PathResourceResolver());
}

@Override
public void addCorsMappings(final CorsRegistry registry) {
    registry.addMapping("/**")
        .allowedOrigins("http://localhost:8080")
        .allowedMethods("POST", "GET")
        //.allowedHeaders("header1", "header2", "header3")
        //.exposedHeaders("header1", "header2")
        .allowCredentials(true).maxAge(3600);
}

}

【讨论】:

    【解决方案2】:

    @CrossOrigin(value = "*") 添加到您的控制器类。您可以将 * 替换为任何特定的 URL,以防仅允许该来源。

    【讨论】:

      【解决方案3】:
          @CrossOrigin(origins = "http://localhost")
          @GetMapping("/rooms/")
          public Object rooms() {
             // your implementation
          }
      

      你可以这样做。

      【讨论】:

        【解决方案4】:

        https://www.viator.com/orion/nova/public/mmblite/styles-53929dcb.css

        实际上遇到了同样的问题,但找到了根本原因和解决方案。 您的请求很可能被中介缓存:负载平衡器、CDN 或在您的应用程序前面缓存 HTTP 服务器作为常规的非 CORS 请求。然后您使用Origin: 发送了请求,但中介返回了相同的缓存响应,因为从缓存响应的角度来看,默认情况下由/path + METHOD + Host:-header 标识,它们是相同的.要告诉缓存带有Origin: 的请求和常规请求(没有Origin: 需要作为独立条目缓存在任何缓存中,我们需要在两个响应中都需要Vary: Origin 标头。这在Spring 5.2.x 中已修复/实现(在我的情况下是 Spring 5.1.9),在你的情况下是 5.0.9 (作为 Spring Boot 2.0.5 的依赖项。)。一旦我升级到 Spring 5.2.0,一旦中介上的缓存过期,一切都会得到修复。我建议升级到 5.2.6 之后(因为 CORS 处理有进一步的变化,这很好)。

        这是他们 (Pivotal) 提交到 Spring 中的那一行(产生了影响):https://github.com/spring-projects/spring-framework/commit/d27b5d0ab6e8b91a77e272ad57ae83c7d81d810b#r36264428

        及其错误描述:https://github.com/spring-projects/spring-framework/issues/22273

        【讨论】:

          【解决方案5】:

          我让它使用以下配置 bean:

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

          请注意,如果请求中存在 Origin-header,则 Spring Boot 只会在 GET 请求中发回 Access-Control-Allow-Origin 标头。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-23
            • 1970-01-01
            • 2012-11-05
            • 2020-02-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多