一般状况下浏览器禁止AJAX从外部获取资源,所以就衍生了CORS这一标准体系,来实现跨域请求。java
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它容许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.web
Spring MVC HandlerMapping 接口对CORS提供了一个内部支持,在成功的映射到一个处理器的请求以后,HanderMapping接口检查CORS的请求配置文件,而后采起下一步行动,预检(Preflight)请求可以被直接的处理,而简单和直接的CORS请求将会被拦截和通过验证,同时还须要CORS请求头的进一步设置。
所以,为了确保可以实现跨域请求,在请求头中会加入Origin这一字段,来实现跨域请求,同时对于不一样的主机而言请求头是不同的。你必须有一些明确的声明的配置文件,若是相应的CORS的配置文件没有找到的话,预检请求将会被拒绝,同时请求头也不会加到相应的响应当中。每个
HandlerMapping可以被独立的配置带着基于
springCorsConfiguration
映射的url模式。一般状况下应用使用MVC Java的配置文件或者XML命名空间来声明这样的映射。一般状况下可以使每个单一的map映射经过全部的HandlerMapping实例。
@CrossOrigin:
这个注解可以使跨域请求实如今注解控制器里面:主要的实现方法以下:api
默认状况下上述注解还实现了如下功能:跨域
1 :全部的origin请求字段。浏览器
2:全部的请求头。服务器
3: 全部的被映射的HTTP方法。mvc
同时@Crossorigin继承全部的类和方法,相关的示例以下:app
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {cors
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
CorsRegistry回调接口,具体的实现例子以下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Add more mappings...
}
}
XML配置:
为了可以使CORS(跨域请求)实如今XML的命名空间须要使用<mvc:cors>组件元素,具体的实现例子以下:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例以下:
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
默认状况下上述注解还实现了如下功能:
1 :全部的origin请求字段。
2:全部的请求头。
3: 全部的被映射的HTTP方法。
同时@Crossorigin继承全部的类和方法,相关的示例以下:
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600) @RestController @RequestMapping("/account") public class AccountController { @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ...
} @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ...
} }
默认状况下,全局配置须要可以知足如下几点:
1 :全部的:Ogrigin字段
2:全部的请求头。
3 :GET HEAD 和POST 方法。
为了可以使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你须要使用CorsRegistry回调接口,具体的实现例子以下:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("https://domain2.com") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(true).maxAge(3600); // Add more mappings...
} }
XML配置:
为了可以使CORS(跨域请求)实如今XML的命名空间须要使用<mvc:cors>组件元素,具体的实现例子以下:
<mvc:cors>
<mvc:mapping path="/api/**" allowed-origins="https://domain1.com, https://domain2.com" allowed-methods="GET, PUT" allowed-headers="header1, header2, header3" exposed-headers="header1, header2" allow-credentials="true" max-age="123" />
<mvc:mapping path="/resources/**" allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例以下:
CorsConfiguration config = new CorsConfiguration(); // Possibly... // config.applyPermitDefaultValues()
config.setAllowCredentials(true); config.addAllowedOrigin("https://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source);