關(guān)于CORS跨域訪問的解釋,請參考下面的博客:
http://www.ruanyifeng.com/blog/2016/04/cors.html
縮簡稱一張圖如下:
CORS跨域原理
實現(xiàn)跨域共需要四步:
第一步
基本不用做什么扒秸,瀏覽器都實現(xiàn)了跨域訪問自動在Request Headers添加跨域的信息:
Origin: http://localhost:8089
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: GET
第二步
服務(wù)端需要告訴瀏覽器,是否允許這個域名跨域訪問自己,以及自己設(shè)置的跨域信息:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: http://localhost:8089
Access-Control-Max-Age: 86400
體現(xiàn)在代碼里就是:
/**
* 設(shè)置跨域請求.
*/
@Configuration
public class CorsConfig {
@Value("${cors.allowed.origin}")
private String allowedOrigin;
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(24 * 3600L); // 預(yù)檢請求的有效期
if (null != allowedOrigin) {
String[] origins = allowedOrigin.split(",");
for (String origin : origins) {
corsConfiguration.addAllowedOrigin(origin); // 允許跨域請求的源地址
}
}
corsConfiguration.addAllowedHeader("*"); // 支持的所有頭信息字段
corsConfiguration.addAllowedMethod("*"); // 支持的所有跨域請求的方法
return corsConfiguration;
}
/**
* Cors過濾器.
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 對接口配置跨域設(shè)置
return new CorsFilter(source);
}
}
將所有允許跨域訪問的源地址以逗號分隔,配置在application.properties中既可赔嚎。也可以
corsConfiguration.setAllowedOrigin(*) // 允許所有的域名跨域訪問旭贬,但不建議這么設(shè)置
默認(rèn)CORS請求不會攜帶Cookie和Http認(rèn)證信息,但是個別瀏覽器比較頑固锐涯,不理會服務(wù)器的感受,強行發(fā)送Cookie填物,這時Access-Control-Allow-Origin就不能設(shè)為星號纹腌,必須指定明確的霎终、與請求網(wǎng)頁一致的域名。
第三步
第四步
這兩就是正常的請求升薯,只不過瀏覽器每次會有一個Origin頭信息字段莱褒;服務(wù)器的回應(yīng),也都會有一個Access-Control-Allow-Origin頭信息字段涎劈。