跨域请求系列之(三) ---------- springmvc实现服务端cors

首先,在服务器端实现跨域资源共享(即: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配置文件中添加如下配置就可以了。


	

 

四、配置的含义

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,该返回值会被缓存,过期之前不需要在发送预检请求

你可能感兴趣的:(跨域请求系列)