跨域:現代瀏覽器出全的考慮,在http/https請求時必須遵守同源策略,否則即使跨域的http/https 請求,默認情況下是被禁止的,ip(域名)不同、或者端口不同、協議不同(比如http、https) 都會造成跨域問題。
一、前端解決方案
- 使用 JSONP 來支持跨域的請求,JSONP 實現跨域請求的原理簡單的說,就是動態創建
script 標簽,然后利用 script 的 SRC 不受同源策略約束來跨域獲取數據。缺點是需
要后端配合輸出特定的返回信息。 - 利用反應代理的機制來解決跨域的問題,前端請求的時候先將請求發送到同源地址的后
端,通過后端請求轉發來避免跨域的訪問。
后來 HTML5 支持了 CORS 協議。CORS 是一個 W3C 標准,全稱是”跨域資源共享”(Cross-origin resource sharing),允許瀏覽器向跨源服務器,發出 XMLHttpRequest 請求,從而克服了 AJAX 只能同源使用的限制。它通過服務器增加一個特殊的 Header[Access-Control-Allow-Origin]來告訴客戶端跨域的限制,如果瀏覽器支持 CORS、並且判斷 Origin 通過的話,就會允許 XMLHttpRequest 發起跨域請求。
前端使用了 CORS 協議,就需要后端設置支持非同源的請求,對於SpringBoot 對於CORS 同樣有着良好的支持,
首先附上官網地址:
https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-cors
二、java跨域的三種配置方式
- 方式一:配置過濾器(全局配置)
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.addExposedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
- 方式二:配置攔截器 (全局配置)
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedHeaders("*")
.allowedOrigins("*")
.allowedMethods("*");
}
}
- 方式三: 單個請求的跨域通過 @CrossOrigin 注解來實現
@RequestMapping("/hello")
@CrossOrigin("http://localhost:8080")
public String hello( ){
return "Hello World";
}
參考資料:https://blog.csdn.net/fxbin123/article/details/80603678