springboot2.4.0跨域问题

升级springboot2.4.0后, allowedOrigin不能用通配符*

@Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 是否允许请求带有验证信息
        corsConfiguration.setAllowCredentials(true);
        // 允许访问的客户端域名
        corsConfiguration.addAllowedOrigin("*");
        // 允许服务端访问的客户端请求头
        corsConfiguration.addAllowedHeader("*");
        // 允许访问的方法名,GET POST等
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

异常:
java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*"since that cannot be set on the “Access-Control-Allow-Origin” response header. To allow credentials to a set of origins, list them explicitly or consider using “allowedOriginPatterns” instead.

其实跟springboot版本没关系,这是cors跨域的机制。

当设置了allowCredentials=true的时候,服务器端响应的Access-Control-Allow-Origin头,它的值不能是*,必须要明确的指定出客户端的origin

关于这个机制,你可以看看这个,末尾有写

你也可以考虑不使用注解,而是使用Filter来实现跨域

:+1:

请问这个问题怎么解决,在线等

上面说了,你可以用这个Filter试试看

@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    // 是否允许请求带有验证信息
    config.setAllowCredentials(true);
    // 允许服务端访问的客户端请求头
    config.addAllowedHeader("*");
    // 如果要限制 HEADER 或 METHOD 请自行更改
    config.addAllowedMethod("*");
    // 设置你要允许的网站域名,如果全允许则设为 *
    config.addAllowedOriginPattern("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
    // 这个顺序很重要哦,为避免麻烦请设置在最前
    bean.setOrder(0);
    return bean;
}