一般狀況下瀏覽器禁止AJAX從外部獲取資源,所以就衍生了CORS這一標準體系,來實現跨域請求。java
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它容許瀏覽器向跨源(協議 + 域名 + 端口)服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制.web
Spring MVC HandlerMapping 接口對CORS提供了一個內部支持,在成功的映射到一個處理器的請求以後,HanderMapping接口檢查CORS的請求配置文件,而後採起下一步行動,預檢(Preflight)請求可以被直接的處理,而簡單和直接的CORS請求將會被攔截和通過驗證,同時還須要CORS請求頭的進一步設置。
所以,爲了確保可以實現跨域請求,在請求頭中會加入Origin這一字段,來實現跨域請求,同時對於不一樣的主機而言請求頭是不同的。你必須有一些明確的聲明的配置文件,若是相應的CORS的配置文件沒有找到的話,預檢請求將會被拒絕,同時請求頭也不會加到相應的響應當中。每個
HandlerMapping可以被獨立的配置帶着基於
springCorsConfiguration
映射的url模式。一般狀況下應用使用MVC Java的配置文件或者XML命名空間來聲明這樣的映射。一般狀況下可以使每個單一的map映射經過全部的HandlerMapping實例。
@CrossOrigin:
這個註解可以使跨域請求實如今註解控制器裏面:主要的實現方法以下:api
默認狀況下上述註解還實現瞭如下功能:跨域
1 :全部的origin請求字段。瀏覽器
2:全部的請求頭。服務器
3: 全部的被映射的HTTP方法。mvc
同時@Crossorigin繼承全部的類和方法,相關的示例以下:app
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {cors
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
CorsRegistry回調接口,具體的實現例子以下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Add more mappings...
}
}
XML配置:
爲了可以使CORS(跨域請求)實如今XML的命名空間須要使用<mvc:cors>組件元素,具體的實現例子以下:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可使跨域請求內置在CorsFliter類當中(即跨域過濾器)。實現配置這個過濾器,CorsConfigurationSource及其構造函數。相關的示例以下:
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
默認狀況下上述註解還實現瞭如下功能:
1 :全部的origin請求字段。
2:全部的請求頭。
3: 全部的被映射的HTTP方法。
同時@Crossorigin繼承全部的類和方法,相關的示例以下:
@CrossOrigin(origins = "https://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) { // ...
} }
默認狀況下,全局配置須要可以知足如下幾點:
1 :全部的:Ogrigin字段
2:全部的請求頭。
3 :GET HEAD 和POST 方法。
爲了可以使CORS(跨域請求)在MVC 的Java 的配置文件裏面配置,你須要使用CorsRegistry回調接口,具體的實現例子以下:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("https://domain2.com") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(true).maxAge(3600); // Add more mappings...
} }
XML配置:
爲了可以使CORS(跨域請求)實如今XML的命名空間須要使用<mvc:cors>組件元素,具體的實現例子以下:
<mvc:cors>
<mvc:mapping path="/api/**" allowed-origins="https://domain1.com, https://domain2.com" allowed-methods="GET, PUT" allowed-headers="header1, header2, header3" exposed-headers="header1, header2" allow-credentials="true" max-age="123" />
<mvc:mapping path="/resources/**" allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可使跨域請求內置在CorsFliter類當中(即跨域過濾器)。實現配置這個過濾器,CorsConfigurationSource及其構造函數。相關的示例以下:
CorsConfiguration config = new CorsConfiguration(); // Possibly... // config.applyPermitDefaultValues()
config.setAllowCredentials(true); config.addAllowedOrigin("https://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source);