Spring Boot 和安全性 - cors

Posted

技术标签:

【中文标题】Spring Boot 和安全性 - cors【英文标题】:Spring boot & security - cors 【发布时间】:2016-07-14 06:05:00 【问题描述】:

根据spring boot文档我添加了bean

 @Bean
WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurerAdapter() 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry.addMapping("/**").allowedOrigins("http://localhost:3000");
        
    ;

从 localhost:3000 启用全局访问,这是我的前端应用程序。 我也使用弹簧安全,所以如果用户输入 localhost:8080/something 他被重定向到登录页面(如果没有登录)。问题是这个全局 cors 配置不起作用。

我有一个简单的控制器,它返回

List<String> 

另一方面,我有角度服务,它负责向服务器发出获取请求。它看起来像这样:

  this.http.get("http://localhost:8080/words", 
            headers: new Headers(
                'Authorization': 'Basic ' + btoa('login:password')
            )
        ).map((res:Response) => res.json())
        .subscribe(
            data =>  this.words = data,
            err => console.error('Error :  ' + err),
            () => console.log('done')
        );

因此我可以在 google chrome 控制台中看到:

 XMLHttpRequest cannot load http://localhost:8080/words. Response for preflight is invalid (redirect)

我该如何解决这个问题?

【问题讨论】:

用那个错误信息在谷歌搜索怎么样? 我认为问题是:***.com/questions/17496452/…***.com/questions/29469249/…希望这些可以帮助你。 能否提供OPTIONS请求的响应内容(标头)?谢谢! 【参考方案1】:

这是因为您的前端应用程序会在实际数据传输发生之前生成一个 OPTIONS HTTP。尝试将此配置添加到您的 spring 项目中:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer 

  @Value("$angular")
  private String angularOrigin;

  @Bean
  public WebMvcConfigurer corsConfigurer()
    return new WebMvcConfigurer() 
      @Override
      public void addCorsMappings(CorsRegistry registry) 
        registry
            .addMapping("/**")
            .allowedOrigins(angularOrigin)
            .allowedHeaders("Authorization", "Cache-Control", "Content-Type", "Accept", "X-Requested-With", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
            .exposedHeaders("Access-Control-Expose-Headers", "Authorization", "Cache-Control", "Content-Type", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
            .allowedMethods("PUT","GET","POST","DELETE","OPTIONS");
      
    ;
  

【讨论】:

以上是关于Spring Boot 和安全性 - cors的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 安全性中禁用 CORS

如何在 Spring Boot 安全性中禁用 CORS

没有弹簧安全性的 Spring Boot + React CORS 问题

Spring boot:无法从另一个 Origin 访问安全资源 - CORS - Spring Security - Spring data rest

Angular 2 + CORS + 带有 Spring Security 的 Spring Boot Rest Controller

Spring Boot中通过CORS解决跨域问题