邪恶的 CORS/CORB - Spring 和休眠、Springboot、Maven 和 Angular js 2,不起作用 - 允许访问控制来源

Posted

技术标签:

【中文标题】邪恶的 CORS/CORB - Spring 和休眠、Springboot、Maven 和 Angular js 2,不起作用 - 允许访问控制来源【英文标题】:The evil CORS/CORB - Spring and hibernate, Springboot, Maven and Angular js 2, not working - Allow access control origin 【发布时间】:2018-12-24 03:29:14 【问题描述】:

请帮忙,我已经尝试了各种方法来修复这个错误,我尝试了 Tomcat web.xml,通过添加过滤器映射、CorsFilter bean、@CrossOrigin,以及禁用浏览器网络安全,但是仍然,这个错误不会发生......也许它隐藏在我无法运动的东西后面。有没有人更好地理解为什么这个错误不会消失。

下面是我的ProductApplication.java bean 方法:

 @Bean
    CorsConfigurationSource corsConfiguarationSource()

        CorsConfiguration configurations = new CorsConfiguration();

        configurations.setAllowedOrigins(Arrays.asList("*"));
        configurations.setAllowCredentials(true);
        configurations.setAllowedHeaders(Arrays.asList("Allow-Control-Allow-Headers","Allow-Control-Allow-Origin","Access-Control-Request-Method","Allow-Control-Request-Headers","Origin","Cache-Origin","Content-Type", "Authorization"));
        configurations.setAllowedMethods(Arrays.asList("DELETE","GET","POST","PATCH","PUT"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configurations);
        return  source;
    

我也尝试过使用 bean:

@Bean
public CorsFilter corsFilter()

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();

config.setAllowCredentials(true);
config.addAllowedOrigin("*");             
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");

source.registerCorsConfiguration("/**", config);                      
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);

return source;

我也尝试过使用带有 @Configuration 注释的单独类:

@Configuration
public class RestConfig

    @Bean
    public CorsFilter processCorsFilter()

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();

    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");             
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("DELETE");

    source.registerCorsConfiguration("/**", config);                      
    //FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    //bean.setOrder(0);

    return new CorsFilter(source);

    

我也试过控制器类中的@CrossOrigin注解:

 @CrossOrigin(origins="http://localhost:3000") 
    @GetMapping("/client")
    public ResponseEntity<List<Client>> getAllClients() 

        List<Client> clientList = services.getClientsList();
        if(clientList != null) 
            return new ResponseEntity<>(clientList, HttpStatus.OK);
        else
            return  new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        
    

提前致谢。

【问题讨论】:

请注意:我知道这可能是一个重复的问题,但是,我已经尝试了前面问题中提到的所有方法......我无法获胜......令人惊讶的是,甚至禁用了浏览器网络安全无法战胜这个邪恶的错误...请帮助,我们将不胜感激。 它们中的任何一个都被调用了吗?如果您在浏览器开发者工具中签入,是否会返回任何标头? 是的,我得到 404 not found 错误:消息没有访问控制来源 如果出现 404 错误,说明你的 URL 不正确,你可以在 postman 中测试 URL 吗? 让我这样做,但是:URL 就像localhost:8080/client 一样简单 【参考方案1】:

根据(Spring) CORS documentation:

确保首先处理 CORS 的最简单方法是使用 CorsFilter。用户可以将CorsFilter 与 Spring 集成 通过使用以下内容提供CorsConfigurationSource 来确保安全:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            // by default uses a Bean by the name of corsConfigurationSource
            .cors().and()
            // ... more configuration calls here
    

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    

我自己使用了这个方法,如前所述,通过覆盖 configure 方法 (WebSecurityConfigurerAdapter#configure) 并提供 CorsConfigurationSource bean 并且它可以工作。


相关阅读:

HttpSecurity#cors

【讨论】:

我也看到了这篇文章...但是我被这三个点弄糊涂了...第 9 行中的这三个点应该是什么? 这三个点表示可以添加更多配置。见this example。这是我的一个演示项目,其中添加了更多配置。 @NeoSono 我编辑了代码以使其清晰 我是否还需要重写配置方法...?还是只吃豆子? @NeoSono,是的,当您使用 Spring Security 时,请参阅 HttpSecurity#cors 我将其添加到帖子中

以上是关于邪恶的 CORS/CORB - Spring 和休眠、Springboot、Maven 和 Angular js 2,不起作用 - 允许访问控制来源的主要内容,如果未能解决你的问题,请参考以下文章

React/Node/Express 和 google OAuth 的 CORS/CORB 问题

为啥可变结构是“邪恶的”?

AVL 树是邪恶的吗? [关闭]

度度熊与邪恶大魔王

邪恶葫芦工具包

为啥strdup被认为是邪恶的