CORS 跨域共享
跨源资源共享(Cross-origin resource sharing, CORS)是由大多数浏览器实现的W3C规范,它允许您以灵活的方式指定哪种跨域请求被授权,而不是使用一些不太安全、功能不太强大的方法,比如IFRAME或JSONP。
Spring BOOT
从4.2开始,Spring MVC已支持CORS。
@CrossOrigin
在Spring Boot中使用带有@CrossOrigin注释的controller方法CORS配置,不需要任何特定的配置。
@CrossOrigin注解可以在类上使用,也可以在方法上使用,如:
@CrossOrigin(origins = "http://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) {
// ...
}
}
常用的属性有2个,分别是origins和maxAge,下面分别解释下:
- origins 是一个字符串数组的类型(String []),用于表示那些域名可以访问此接口/映射。多个域名之间用逗号“,”隔开,如果想向所有网址开放,可以直接填写星号“*”。
- maxAge 还没有找到官方的说明,其他开发者解释为“预请求的结果的有效期”,即COOKIE的有效期,单位是秒。
如果只在方法上或者类上使用@CrossOrigin注解,则默认该映射接受所有的网站发送过来的请求、接受所有类型的http请求和接受所有的不同内容的头部信息(Header),如:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
@CrossOrigin可以同时在类上、方法上同时使用,来控制不同网站访问不同的映射,如:
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
remove方法可以被所有网站的访问,retrieve方法只接受http://domain2.com网站发送的请求。
全局CORS配置
全局CORS配置可以通过注册一个WebMvcConfigurer bean并使用自定义的addcorsmapping (CorsRegistry)方法来定义,如:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}