springmvc springboot 跨域问题(CORS)
官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html
springmvc springboot 跨域问题(CORS)
控制器方法CORS设定
你可以添加到你的@RequestMapping
注解处理方法@CrossOrigin
,以便能够在其上CORS注释(默认情况下@CrossOrigin
允许所有的起源和在指定的HTTP方法@RequestMapping
注释):
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
也可以使CORS整个控制器:
@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) { // ... } }
在这个例子中CORS的支持,是你在启用retrieve()
和remove()
处理方法,你还可以看到如何使用自定义CORS配置@CrossOrigin
属性。
你甚至可以使用两个控制器和方法级CORS配置,Spring会再结合这两个注释属性来创建一个合并CORS配置。
@CrossOrigin(maxAge = 3600) @RestController @RequestMapping("/account") public class AccountController { @CrossOrigin(origins = "http://domain2.com") @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
如果你正在使用Spring Security,确保enable CORS at Spring Security level 以及允许其利用在Spring MVC的级别定义的配置。
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and()... } }
全局CORS配置
除了细粒度的,基于注解的配置,你可能会想定义一些全局CORS配置为好。这是类似于使用过滤器,但可以声明withing Spring MVC和细粒度组合@CrossOrigin
配置。默认情况下,所有的起源和GET
,HEAD
和POST
方法都是允许的。
JavaConfig
启用CORS为整个应用程序是非常简单:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
如果你在使用Spring boot,建议声明WebMvcConfigurer bean
如下:
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }; } }
你可以轻松地更改任何属性,以及仅适用此CORS配置到特定的路径模式:
@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 Security,确保enable CORS at Spring Security level 以及允许其利用在Spring MVC的级别定义的配置。
XML命名空间
也可以与配置CORS MVC XML命名空间。
这个最小的XML配置启用CORS /**
具有比JavaConfig一个相同的默认属性路径图案:
<mvc:cors> <mvc:mapping path="/**" /> </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 Security的,不要忘了enable CORS at Spring Security level 还有:
<http> <!-- Default to Spring MVC's CORS configuration --> <cors /> ... </http>
它是如何工作的?
CORS请求(包括那些预检与OPTIONS
方法)被自动分发到各个HandlerMapping
注册秒。他们处理CORS预检要求和拦截CORS简单而实际的请求得益于CorsProcessor实现(DefaultCorsProcessor以添加相关CORS响应头(如默认情况下)Access-Control-Allow-Origin
)。CorsConfiguration允许你指定CORS请求应如何处理:允许起源,头,方法等,可以以各种方式提供:
AbstractHandlerMapping#setCorsConfiguration()
允许指定Map
几个CorsConfiguration映射路径模式,如/api/**
- 子类可以提供自己
CorsConfiguration
的首要AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)
方法 - 处理程序可以实现
CorsConfigurationSource
接口(像ResourceHttpRequestHandler
现在一样),以提供一个CorsConfiguration为每个请求。
基于过滤器CORS支持
至于其它方法替代以上呈现,Spring框架还提供了一个CorsFilter。在这种情况下,而不是使用@CrossOrigin
或WebMvcConfigurer#addCorsMappings(CorsRegistry)
,例如,你可以声明过滤器在Spring boot应用程序如下:
@Configuration public class MyConfiguration { @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("http://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(0); return bean; } }