官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.htmlhtml
你能够添加到你的@RequestMapping
注解处理方法@CrossOrigin
,以便可以在其上CORS注释(默认状况下@CrossOrigin
容许全部的起源和在指定的HTTP方法@RequestMapping
注释):java
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
也可使CORS整个控制器:git
@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
属性。github
你甚至可使用两个控制器和方法级CORS配置,Spring会再结合这两个注释属性来建立一个合并CORS配置。web
@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的级别定义的配置。spring
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and()... } }
除了细粒度的,基于注解的配置,你可能会想定义一些全局CORS配置为好。这是相似于使用过滤器,但能够声明withing Spring MVC和细粒度组合@CrossOrigin
配置。默认状况下,全部的起源和GET
,HEAD
和POST
方法都是容许的。api
启用CORS为整个应用程序是很是简单:跨域
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
若是你在使用Spring boot,建议声明WebMvcConfigurer bean
以下:springboot
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }; } }
你能够轻松地更改任何属性,以及仅适用此CORS配置到特定的路径模式:mvc
@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的级别定义的配置。
也能够与配置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为每一个请求。至于其它方法替代以上呈现,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; } }