# Spring 和 CORS

> 原文： [https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/](https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/)

**CORS**（跨域资源共享）允许网页从其他域（例如， CDN 中的字体，CSS 或静态图像。 CORS 有助于将来自多个域的 Web 内容提供给通常具有[同源](https://en.wikipedia.org/wiki/Same-origin_policy)安全策略的浏览器。

在此示例中，我们将学习在方法级别和全局级别在 [Spring MVC](https://howtodoinjava.com/spring-mvc-tutorial/) 应用程序中启用**启用 Spring CORS 支持**。

> 阅读更多： [Java CORS 过滤器示例](https://howtodoinjava.com/servlets/java-cors-filter-example/)

## 1\. Spring CORS – `@CrossOrigin`的方法级别

Spring MVC 提供[`@CrossOrigin`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html)注解。 该注解将注解的方法或类型标记为允许跨源请求。

#### 1.1. Spring CORS 允许所有

默认情况下，`@CrossOrigin`允许所有来源，所有标头，在[`@RequestMapping`](https://howtodoinjava.com/spring5/webmvc/controller-getmapping-postmapping/)注解中指定的[ HTTP 方法](https://restfulapi.net/http-methods/)和`maxAge`为 30 分钟。

您可以通过为注解属性赋值来覆盖默认的 CORS 设置：

| 属性 | 描述 |
| --- | --- |
| `origins` | 允许来源的列表。 它的值位于预先响应和实际响应的`Access-Control-Allow-Origin`标头中。 |
| | `"*"` – 表示允许所有来源。 |
| | 如果未定义，则允许​​所有来源。 |
| `allowedHeaders` | 可以在实际请求中使用的请求标头列表。 在预先响应标头`Access-Control-Allow-Headers`中使用值。 |
| | `"*"` – 表示允许客户端请求的所有标头。 |
| | 如果未定义，则允许​​所有请求的标头。 |
| `methods` | 支持的 HTTP 请求方法列表。 如果未定义，则使用由`RequestMapping`注解定义的方法。 |
| `exposedHeaders` | 浏览器将允许客户端访问的响应标头列表。 在实际响应标头`Access-Control-Expose-Headers`中设置值。 |
| | 如果未定义，则使用一个空的公开头列表。 |
| `allowCredentials` | 它确定浏览器是否应包括与请求关联的任何 cookie。 |
| | `false` – 不应该包含 cookie。 |
| | `" "`（空字符串） – 表示未定义。 |
| | `true` – 预先响应将包含标头`Access-Control-Allow-Credentials`，其值设置为 true。 |
| | 如果未定义，则允许​​凭据。 |
| `maxAge` | 预先响应的缓存持续时间的最长期限（以秒为单位）。 在标头`Access-Control-Max-Age`中设置值。 |
| | 如果未定义，则将最大年龄设置为 1800 秒（30 分钟）。 |

#### 1.2. 类/控制器级别的`@CrossOrigin`

`HomeController.java`

```java
@CrossOrigin(origins = "*", allowedHeaders = "*")
@Controller
public class HomeController 
{
	@GetMapping(path="/")
	public String homeInit(Model model) {
		return "home";
	}
}

```

> 阅读更多 – [Spring 5 MVC 示例](https://howtodoinjava.com/spring5/webmvc/spring5-mvc-hibernate5-example/)

#### 1.3. 方法级别的`@CrossOrigin`

`HomeController.java`

```java
@Controller
public class HomeController 
{
	@CrossOrigin(origins = "*", allowedHeaders = "*")
	@GetMapping(path="/")
	public String homeInit(Model model) {
		return "home";
	}
}

```

#### 1.4. `@CrossOrigin`的方法级别覆盖

`homeInit()`方法只能从`http://example.com`域访问。 `HomeController`中的其他方法可以从所有域访问。

`HomeController.java`

```java
@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController 
{
	@CrossOrigin(origins = "http://example.com")
	@GetMapping(path="/")
	public String homeInit(Model model) {
		return "home";
	}
}

```

## 2\. Spring CORS – 全局 CORS 配置

#### 2.1. 实现`WebMvcConfigurer`

要为整个应用程序启用 CORS，请使用`WebMvcConfigurer`添加`CorsRegistry`。

`CorsConfiguration.java`

```java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class CorsConfiguration implements WebMvcConfigurer
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST");
    }
}

```

#### 2.2. `WebMvcConfigurer` Bean

在 Spring Boot 应用程序中，建议仅声明一个`WebMvcConfigurer` bean。

`CorsConfiguration.java`

```java
@Configuration
public class CorsConfiguration 
{
    @Bean
    public WebMvcConfigurer corsConfigurer() 
    {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:8080");
            }
        };
    }
}

```

#### 2.3. Spring Security 的 CORS

要通过 [Spring Security](https://howtodoinjava.com/spring-security-tutorial/)启用 CORS 支持，请配置[`CorsConfigurationSource`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfigurationSource.html) bean 并使用`HttpSecurity.cors()`配置。

`WebSecurityConfig.java`

```java
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.cors().and()
			//other config
	}

	@Bean
	CorsConfigurationSource corsConfigurationSource() 
	{
		CorsConfiguration configuration = new CorsConfiguration();
		configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", configuration);
		return source;
	}
}

```

将我的问题放在评论部分。

学习愉快！

[下载源码](https://github.com/lokeshgupta1981/spring-webmvc)