首先,在服务器端实现跨域资源共享(即:cors)的方式有几种,跨域请求系列之(二)是基于tomcat容器提供的一个CorsFilter实现的。这里我们是基于springmvc来实现服务端cors,具体的内容请参考官方文档。
需要注意的一点是,springmvc提供的cros支持是在4.2版本之上。如果你的项目依赖的spring的版本低于该版本,请使用tomcat提过的方式。
springmvc提供cors的方式有三中:
一、基于注解
启用cors使用的注解是:@CrossOrigin,这个注解可以用在方法上,也可以用在controller类上。如下所示:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
}
使用在方法上,是指定该方法允许跨域请求
@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) {
// ...
}
}
使用在controller上,是指定该controller中的所用方法都允许跨域请求
我们可以通过该注解中的属性来指定具体的配置,默认的不设置的时候,是允许所有的源和get,head,post方法。
二、基于java配置
基于Java实现,就是重写org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport类中的addCorsMappings(CorsRegistry registry)方法,将需要的配置注册到这个方法的注册器中(registry)。
一下分别是spring中的配置和springBoot中的配置。
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.exposedHeaders("Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*")
.allowCredentials(true)
.maxAge(3600);
}
}
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedHeaders("*").allowedMethods("*").allowedOrigins("*").allowCredentials(true)
.maxAge(3600);
}
}
//这是在spring中的配置
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
}
//这是在springboot中的配置
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
};
}
}
三、基于xml配置
基于xml的配置就更简单了,只需要在spring的xml配置文件中添加如下配置就可以了。
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="false"
max-age="123" />
</mvc:cors>
四、配置的含义
addMapping:设置cors允许的url
exposedHeaders:设置XMLHttpRequest的getResponseHeader方法中的字段有哪些(基本字段有:Cache-Control、Content-Language、 Content-Type、Expires、Last-Modified、Pragma),如果想拿到其他字段就可以加在这个配置中,需要用逗号分隔
allowedHearders:设置预检请求被支持请求头字段
allowedMethods:设置允许的请求方法,用逗号分隔
allowedOrigins:设置允许的请求源
allowCredentials:表示服务器是否允许发送cookie,true表示cookie可以包含在请求中一起发送给server,必须设置为true
maxAge:设置预检请求的有效期,单位为s,该返回值会被缓存,过期之前不需要在发送预检请求