Spring MVC配置CORS

Spring Framework 从4.2开始支持配置CORS。

Spring MVC支持CORS的范围包括:

  1. 方法级别配置CORS
  2. 全局配置CORS

方法级别配置CORS

使用注解@CrossOrgin可以对@RequestMapping注解的方法设置CORS。

@RestController
@RequestMapping("/users")
public class UserController {

	@CrossOrigin
	@GetMapping("/{id}")
	public User query(@PathVariable Long id) {
		// ...
	}

	@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}

@CrossOrigin默认设置的orgins为所有,即Access-Control-Allow-Origin=*,指定的方法为@RequestMapping设置的HTTP方法。

@CrossOrigin支持以下几种配置:

  • origins:配置请求来源,设置Access-Control-Allow-Origin。星号*表示所有。
  • allowedHeaders:允许header,设置Access-Control-Allow-Headers。星号表示运行所有的头信息。
  • exposedHeaders:暴露的头信息,设置Access-Control-Expose-Headers,默认空。
  • allowCredentials:设置Access-Control-Allow-Credentials,请求是否带cookie信息,默认为允许。
  • maxAge:设置Access-Control-Max-Age,默认为1800秒,即30分。
  • methods:请求的HTTP方法,默认为@RequestMapping设置的HTTP方法。

@CrossOrigin也可配置在Controller级别设置,应用于Controller里的所有@RequestMapping的方法

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/users")
public class UserController {

	@CrossOrigin("http://example.com")
	@GetMapping("/{id}")
	public User query(@PathVariable Long id) {
		// ...
	}

	@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
	public void remove(@PathVariable Long id) {
		// ...
	}
}

当Controller级别和方法级别同时配置了@CorsOrigin时,它会合并两者的配置。

全局配置CORS

全局配置有两种方式:基于JavaConfig和基于XML。

JavaConfig

JavaConfig使用CorsRegistry对全局配置CORS。

@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);
	}
}

Spring Boot 配置全局CORS

使用spring-boot可以把@EnableWebMvc去掉。也可以返回一个WebMvcConfigurer

@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使用<mvc:cors></cors>

<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:mapping path="/resources/**"
		allowed-origins="http://domain1.com" />

</mvc:cors>

版权声明:著作权归作者所有。

相关推荐

Spring Boot集成RabbitMQ发送接收JSON

在Spring Boot 集成RabbitMQ一文中介绍了如何集成RabbitMQ。默认情况下发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。ObjectMapper最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送。如下:@Autowired private ObjectMapper&nbs

Spring Boot 集成RabbitMQ

此处假设已经安装好了RabbitMQ,主要讲述使用Spring Boot如何集成RabbitMQ。添加依赖在Maven的pom.xml添加rabbitmq的starter依赖,内容如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo

Spring Boot使用springProfile实现Logback多环境的通用配置

在一个基于Spring boot开发的项目里,常常需要有多套环境的配置:开发,测试以及产品。这里给出一个logback的通用配置。在src/main/resources目录下创建配置文件logback-spring.xml,多环境的通用配置内容如下:<?xml version="1.0" encoding="UTF-8"?

Spring Boot集成kafka

Spring Boot对kafka提供了自动配置(auto configuration)。使用用Spring Boot只需要做很少的配置即可集成对kafka的访问。pom配置1、继承spring-boot-starter-parent<parent>   <groupId>org.springframework.boot&l

Spring Boot:日志集成

Java日志框架Java有好几个日志框架,我们有时在选择Java日志框架时会有点迷惑。下面几个是常用的日志框架Common Logging:Apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。SLF4J(Simple Logging Facade for JAVA):和Common Logging一样,是一个门面框架,是对