Spring 框架对跨域资源访问的配置
目录
全称:Cross-Origin Resource Share,跨域资源共享,是针对浏览器为安全起见对Ajax采用的同源策略的提出一种标准,可以让浏览器访问服务器的跨域资源,这需要服务器做好相应配置。
浏览器的 Ajax 请求有两种一种是简单请求(表单请求),另一种是复杂请求(比如要求json返回),浏览器对这两种方式的处理是不一样的。
- 简单请求:直接带上 Origin 头即可
- 复杂请求:需要先发 Options 请求进行预检查,然后如果通过就直接带上 Origin 头即可
上面都是由浏览器自动处理的,开发者不需要做什么。
重点是服务器怎么配置,以 Spring Boot 2.3.1 (Spring Security Starter)为例讲四种方式。
@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;
}
}
@RestController
public class HomeController(){
@CrossOrigin("https://example.com")
public String hello(){
return "world";
}
}
@CrossOrigin 跟 @RequestMapping 用法挺像的,默认情况下@CrossOrigin允许:
- 所有的域。
- 所有的headers
- 将控制器方法映射到的所有HTTP方法。
- maxAge设置为30分钟。
@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...
}
@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 全局配置。