Spring 和 CORS

Spring 和 CORS

原文: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/

CORS(跨域资源共享)允许网页从其他域(例如, CDN 中的字体,CSS 或静态图像。 CORS 有助于将来自多个域的 Web 内容提供给通常具有同源安全策略的浏览器。

在此示例中,我们将学习在方法级别和全局级别在 Spring MVC 应用程序中启用启用 Spring CORS 支持

阅读更多: Java CORS 过滤器示例

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

Spring MVC 提供@CrossOrigin注解。 该注解将注解的方法或类型标记为允许跨源请求。

1.1. Spring CORS 允许所有

默认情况下,@CrossOrigin允许所有来源,所有标头,在@RequestMapping注解中指定的 HTTP 方法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

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

阅读更多 – Spring 5 MVC 示例

1.3. 方法级别的@CrossOrigin

HomeController.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

@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

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

@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启用 CORS 支持,请配置CorsConfigurationSource bean 并使用HttpSecurity.cors()配置。

WebSecurityConfig.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;
	}
}

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

学习愉快!

下载源码