带Spring的CORS

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

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

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

目录

1. Spring CORS-使用@CrossOrigin的方法级别
2. Spring CORS- 全局CORS配置

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

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

1.1。Spring CORS允许所有

默认情况下,@ CrossOrigin允许所有来源,所有标头,注解中指定的HTTP方法@RequestMapping以及maxAge30分钟的时间。

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

属性 描述
origins 允许的来源清单。它的值放在Access-Control-Allow-Origin飞行前响应和实际响应的标头中。

  • "*" –表示允许所有来源。
  • 如果未定义,则允许所有原点。
allowedHeaders 可以在实际请求中使用的请求标头列表。在预检的响应标头中使用值Access-Control-Allow-Headers

  • "*" –表示允许客户端请求的所有标头。
  • 如果未定义,则允许所有请求的标头。
methods 支持的HTTP请求方法列表。如果未定义,RequestMapping则使用注解定义的方法。
exposedHeaders 浏览器将允许客户端访问的响应标头列表。在实际响应头中设置值Access-Control-Expose-Headers

  • 如果未定义,则使用一个空的公开标题列表。
allowCredentials 它确定浏览器是否应包括与请求关联的任何cookie。

  • false –不应该包含cookie。
  • " "(空字符串)–表示undefined
  • true–飞行前响应将包括标头Access-Control-Allow-Credentials,其值设置为true。
  • 如果未定义,则允许凭据。
maxAge 飞行前响应的缓存持续时间的最长期限(以秒为单位)。值设置在header中Access-Control-Max-Age

  • 如果未定义,则将最大年龄设置为1800秒(30分钟)。

1.2。@CrossOrigin在类/控制器级别

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

阅读更多– Spring 5 MVC示例

1.3。方法级别的@CrossOrigin

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

1.4。@CrossOrigin在方法级别被覆盖

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

@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,请使用WebMvcConfigureradd CorsRegistry

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应用程序中,建议仅声明一个WebMvcConfigurerbean。

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

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

如果您有任何疑问,请在评论区留言,我会一一解答。

学习愉快!

saigon has written 1440 articles

One thought on “带Spring的CORS

Leave a Reply