官方文檔: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; } }