Spring 框架对跨域资源访问的配置

Spring 框架对跨域资源访问的配置

什么是 CORS ?

全称:Cross-Origin Resource Share,跨域资源共享,是针对浏览器为安全起见对Ajax采用的同源策略的提出一种标准,可以让浏览器访问服务器的跨域资源,这需要服务器做好相应配置。

浏览器的 Ajax 请求有两种一种是简单请求(表单请求),另一种是复杂请求(比如要求json返回),浏览器对这两种方式的处理是不一样的。

  • 简单请求:直接带上 Origin 头即可
  • 复杂请求:需要先发 Options 请求进行预检查,然后如果通过就直接带上 Origin 头即可

上面都是由浏览器自动处理的,开发者不需要做什么。

重点是服务器怎么配置,以 Spring Boot 2.3.1 (Spring Security Starter)为例讲四种方式。

Spring Security 全局配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@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  
   //默认配置一个Bean Name为corsConfigurationSource  
  .cors().and()
  ...
}
       //配置那些域可以访问的我的资源
@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;
	}
}

Spring 方法级控制 @CrossOrigin

1
2
3
4
5
6
7
8
@RestController
public class HomeController(){
  
  @CrossOrigin("https://example.com")
  public String hello(){
    return "world";
  }
}

@CrossOrigin 跟 @RequestMapping 用法挺像的,默认情况下@CrossOrigin允许:

  • 所有的域。
  • 所有的headers
  • 将控制器方法映射到的所有HTTP方法。
  • maxAge设置为30分钟。

Spring 全局配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
 
        registry.addMapping("/api/**")
            .allowedOrigins("http://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);
 
 
        // Add more mappings...
    }

Spring Boot 全局配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Configuration
public class CORSConfiguration {

@Bean
public WebMvcConfigurer corsConfigurer() {
   return new WebMvcConfigurerAdapter() {

@Override
public void addCorsMappings(CorsRegistry registry) {
   //addMapping 跨域所能访问的路径
   //allowedOrigins:那些域可以访问,默认为任何域都可以访问
    registry.addMapping("/api/**").allowedOrigins("*");
   }
  };
}
}

由于本项目加入了 Spring Security 所以推荐 Spring Security 全局配置。


Spring、Spring-Boot、Spring-Security中对CORS(跨域资源共享)的支持

updatedupdated2020-07-122020-07-12
加载评论