1. 什么是跨域HTTP請求
現代瀏覽器出于安全的考慮,使用 XMLHttpRequest對象發(fā)起 HTTP請求時必須遵守同源策略,否則就是跨域的HTTP請求,默認情況下是被禁止的。跨域HTTP請求是指A域上資源請求了B域上的資源,舉例而言,部署在A機器上Nginx上的js代碼通過ajax請求了部署在B機器Tomcat上的RESTful接口。
IP(域名)不同、或者端口不同,都會造成跨域問題。為了解決跨域的問題,曾經出現過jsonp、代理文件等方案,應用場景受限,維護成本高,直到HTML5帶來了CORS協(xié)議。
CORS是一個W3C標準,全稱是”跨域資源共享”(Cross-origin resource sharing),允許瀏覽器向跨源服務器,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。它通過服務器增加一個特殊的Header[Access-Control-Allow-Origin]來告訴客戶端跨域的限制,如果瀏覽器支持CORS、并且判斷Origin通過的話,就會允許XMLHttpRequest發(fā)起跨域請求。
CROS常見header
Access-Control-Allow-Origin:http://somehost.com 表示允許http://somehost.com發(fā)起跨域請求。
Access-Control-Max-Age:86400 表示在86400秒內不需要再發(fā)送預校驗請求。
Access-Control-Allow-Methods: GET,POST,PUT,DELETE 表示允許跨域請求的方法。
Access-Control-Allow-Headers: content-type 表示允許跨域請求包含content-type
2. 在spring boot工程中配置CORS跨域
這里匹配了所有的URL,允許所有的外域發(fā)起跨域請求,允許外域發(fā)起請求任意HTTP Method,允許跨域請求包含任意的頭信息。
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*");
}
};
}
}
也可以參考:https://spring.io/guides/gs/rest-service-cors/
跨域資源共享 CORS 詳解:http://www.ruanyifeng.com/blog/2016/04/cors.html