Spring Global CORS配置不起作用,但控制器级别配置确实如此



我试图通过下面显示的WebMvcConfigurerAdapter在全球配置CORS。为了测试,我通过创建以模拟外部服务创建的小节点应用来击中我的API端点。当我尝试这种方法时,响应不包含正确的标题,并且会失败

XMLHttpRequest cannot load http://localhost:8080/api/query/1121. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:333' is therefore not allowed access.

全局配置

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/query/**")
                    .allowedOrigins("*")
                    .allowedHeaders("*")
                    .allowCredentials(true);
        }
}

但是,当我使用@CrossOrigin注释时,它可以用适当的标头做出响应。

@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*")
@RestController
@RequestMapping(value = "/api/query", produces = MediaType.APPLICATION_JSON_VALUE)
public class QueryController {
   ......
}

产生

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:333

我缺少使全局配置工作的方法(在此处遵循说明https://spring.io/blog/2015/06/08/cors-support-in-spring-frame-framework)。我觉得我缺少一些简单的东西,因为注释控制器正常工作。

为了使全局cors配置工作,客户端必须在选项请求中添加这两个标头。

Origin: http://host.com
Access-Control-Request-Method: POST

但是,@crossorigin注释只需要"原始"标题。
您的客户端可能添加了" Origin"标头,但缺少"访问控制 - 重新Quest-Method" .....这就是为什么它可以使用@Crossorigin为您服务,但不使用Global Config。

您没有在其中声明的方法,默认情况下仅接受方法。尝试registry.allowedMethods("*");

我正面临相同的问题,设置 maxage 属性,一切都开始工作了!

@Bean
public WebMvcConfigurer CORSConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedHeaders("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                    .maxAge(-1)   // add maxAge
                    .allowCredentials(false);
        }
    };
}

如果您检查 crossorigin 注释,它的默认值分配给该属性

/**
 * <p>By default this is set to {@code 1800} seconds (30 minutes).
 */
long maxAge() default -1;

我能够在本期记录的确切问题后,能够使Spring Global CORS配置工作。我不得不做2件事:

  1. 如果允许的元素是正确的,则不能 *。这是在mozilla.org

  2. 上记录的
  3. 删除MVC:从弹簧XML驱动注释。不能同时具有XML配置和@enableWebMVC。没有@enablewebmvc,全球类将无法正常工作,因此必须删除MVC:注释驱动的驱动。

我只是遇到了完全相同的问题,此线程中的解决方案都没有。我已经通过以下内容解决了它:

新的配置bean:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilterConfiguration {
  @Bean
  public CorsFilter corsFilter() {
      UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
      CorsConfiguration config = new CorsConfiguration();
      config.setAllowCredentials(true);
      config.addAllowedOrigin("*");
      config.setAllowedMethods(Arrays.asList("POST", "OPTIONS", "GET", "DELETE", "PUT"));
      config.setAllowedHeaders(Arrays.asList("X-Requested-With", "Origin", "Content-Type", "Accept", "Authorization"));
      source.registerCorsConfiguration("/**", config);
      return new CorsFilter(source);
  }
}

对我的Web.xml进行修改,以添加所有URL的新过滤器:

<filter>
  <filter-name>corsFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>corsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

显然您可以对CORS进行相应的配置。

我面临类似的问题。我将WebMvcconFigurerAdapter更改为WebMvcconFigurationsupport,然后开始工作。

除此之外,我还将XML配置文件中定义的RequestMappingHandLermapping移至Java配置。

我在Spring MVC应用程序上也有相同的问题(不是Spring Boot)。我解决问题的唯一方法是将CORS过滤器明确添加到弹簧安全过滤器链中:

public class MySecurityInitializer extends AbstractSecurityWebApplicationInitializer {
  protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
    final FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", corsFilter());
    corsFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
  }
  protected CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(Arrays.asList(CrossOrigin.DEFAULT_ORIGINS));
    config.setAllowedMethods(Arrays.asList("POST", "OPTIONS", "GET", "DELETE", "PUT"));
    config.setAllowedHeaders(Arrays.asList(CrossOrigin.DEFAULT_ALLOWED_HEADERS));
    config.setAllowCredentials(CrossOrigin.DEFAULT_ALLOW_CREDENTIALS);
    config.setMaxAge(CrossOrigin.DEFAULT_MAX_AGE);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
  }
}

运气!

我也有类似的问题,并且似乎没有任何方法(除了为每个控制器使用@CrossOrigin注释)。我遵循了Bharat Singh的解决方案之上,在对弹簧框架内部进行了一些调试之后 - 这是对我有用的方法( Spring Boot 2.0.6 Spring Framework 5.0.10 ):

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
/* (non-Javadoc)
 * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
 */
@Override
protected void addCorsMappings(CorsRegistry registry) {
    //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"!
    registry.addMapping("/**")
        .allowedMethods("GET", "POST", "PUT", "DELETE")
        .allowedOrigins("*")
        .allowedHeaders("*")
        .allowCredentials(false);
    }
}

最初,当我使用 "/api/**"映射时,它是在春季内配置的,但是由于应用程序是用"/api"上下文部署的 - 诸如"/api/session/login"之类的请求被内部映射到"/session/login",并且找不到CORS配置中的此类映射 - 请注意!/p>

我认为您的映射定义缺少*

registry.addMapping("/api/query/**")

没有额外的*,此配置未映射到/api/query/1121请求路径(但它可以在/api/query/5上使用)。

我试图通过WebMvcconFigurerAdapter向全球配置COR,并显示了您的日志。我找到了日志消息,但是有错误的错误

访问XMLHTTPREQUEST在" Myurl"的'Myurl'''来自"某些起源"已被CORS策略所阻止:对前飞行请求的响应不会传递访问控制检查:no'access-controll-allow-allow-hallow-origin'标头是Presnet的。请求的资源。

我的案例也擅长@crossorigin,但不适合全球配置。我希望这会有所帮助。

原因是web.xml。

1。我有lt; context:component-scan base-package =&quot"一些基本包装"但是类Webconfig不在"某些基本包装"软件包中,而是在上层软件包中。我将webconfig移至"一些基本包装"软件包和

2。我删除了&lt; MVC:注释驱动/&gt;因为我已经在WebConfig类中有@enablewebmvc。

它有效。

相关内容

  • 没有找到相关文章

最新更新