SpringBoot實現配置跨域請求
一、什麼是跨域請求?
跨域請求,就是說瀏覽器在執行指令碼檔案的ajax請求時,指令碼檔案所在的服務地址和請求的服務地址不一樣。說白了就是ip、網路協議、埠都一樣的時候,就是同一個域,否則就是跨域。這是由於Netscape提出一個著名的安全策略——同源策略造成的,這是瀏覽器對JavaScript施加的安全限制。是防止外網的指令碼惡意攻擊伺服器的一種措施。
下面是幾個跨域的例子:
http://www.123.com/index.html 呼叫 http://www.123.com/server.php (非跨域) http://www.123.com/index.html 呼叫 http://www.456.com/server.php(主域名不同:123/456,跨域) http://abc.123.com/index.html 呼叫 http://def.123.com/server.php (子域名不同:abc/def,跨域) http://www.123.com:8080/index.html 呼叫 http://www.123.com:8081/server.php (埠不同:8080/8081,跨域) http://www.123.com/index.html 呼叫 https://www.123.com/server.php (協議不同:http/https,跨域) 請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。
二、SpringBoot工程如何解決跨域問題?
那麼如何在SpringBoot中處理跨域問題呢?方法有很多,這裡著重講一種——利用@Configuration配置跨域。
程式碼實現如下:
/** * * 設定跨域請求 */ @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 設定訪問源地址corsConfiguration.addAllowedHeader("*"); // 2 設定訪問源請求頭 corsConfiguration.addAllowedMethod("*"); // 3 設定訪問源請求方法 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); // 4 對介面配置跨域設定 return new CorsFilter(source); } }
“*”代表全部。”**”代表適配所有介面。
其中addAllowedOrigin(String origin)方法是追加訪問源地址。如果不使用”*”(即允許全部訪問源),則可以配置多條訪問源來做控制。
例如:
corsConfiguration.addAllowedOrigin("http://www.aimaonline.cn/"); corsConfiguration.addAllowedOrigin("http://test.aimaonline.cn/");
檢視CorsConfiguration類的官方文件:
(http://docs.spring.io/spring/docs/4.2.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html#addAllowedOrigin-java.lang.String-)
我們可以找到官方對setAllowedOrigins(List allowedOrigins)和addAllowedOrigin(String origin)方法的介紹。
addAllowedOrigin是追加訪問源地址,而setAllowedOrigins是可以直接設定多條訪問源。
但是有一點請注意,我檢視setAllowedOrigins方法原始碼時發現,原始碼如下:
public void setAllowedOrigins(List<String> allowedOrigins) { this.allowedOrigins = allowedOrigins != null?new ArrayList(allowedOrigins):null; }
根據原始碼可以得知,setAllowedOrigins會覆蓋this.allowedOrigins。所以在配置訪問源地址時,
addAllowedOrigin方法要寫在setAllowedOrigins後面,當然了,一般情況下這兩個方法也不會混著用。
addAllowedHeader、addAllowedMethod、registerCorsConfiguration方法和addAllowedOrigin的原始碼差不太多,這裡就不一一介紹了。感興趣的朋友可以自行查閱。
三、其他實現跨域請求方法
當然。除了用這種初始化配置的方法設定跨域問題,在官方的文件中也介紹了其他實現跨域請求的方法:
(http://spring.io/blog/2015/06/08/cors-support-in-spring-framework)。
(第二種跨域方法:)例如在介面上使用@CrossOrgin註解:
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
對於上述程式碼,官方給出如下一段說明:
You can add to your @RequestMapping annotated handler method a @CrossOrigin annotation in order to enable CORS on it (by default @CrossOrigin allows all origins and the HTTP methods specified in the @RequestMapping annotation).
意思就是可以直接在@RequestMapping介面上使用@CrossOrigin實現跨域。@CrossOrigin預設允許所有訪問源和訪問方法。
上面是對方法運用註解,還可以這樣:
//@CrossOrigin 表示所有的URL均可訪問此資源 @CrossOrigin(origins = "http://127.0.0.1:8093")//表示只允許這一個url可以跨域訪問這個controller @RestController @RequestMapping("/testCorss") public class CorssOriginController { //可以對方法運用該註解 //@CrossOrigin(origins = "http://127.0.0.1:8093") @GetMapping("/getString") public String getString(){ return "跨域成功!"; } }
程式碼說明:總的來說,@CrossOrigin這個註解用起來很方便,這個可以用在方法上,也可以用在類上。如果你不設定他的value屬性,或者是origins屬性,就預設是可以允許所有的URL/域訪問。
- value屬性可以設定多個URL。
- origins屬性也可以設定多個URL。
- maxAge屬性指定了準備響應前的快取持續的最大時間。就是探測請求的有效期。
- allowCredentials屬性表示使用者是否可以傳送、處理 cookie。預設為false
- allowedHeaders屬性表示允許的請求頭部有哪些。
- methods屬性表示允許請求的方法,預設get,post,head。
還有一種方法(第三種跨域方法)是直接對整個Controller進行跨域設定:
@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) { // ... } }
這裡,可以對@CrossOrigin設定特定的訪問源,而不是使用預設配置。
以上就是對SpringBoot下配實現跨域請求的介紹。下面ref也有其他跨域方法,也寫得不錯,給個參考!!!
ref:
(20條訊息) SpringBoot解決跨域的5種方式_wh柒八九的部落格-CSDN部落格_springboot解決跨域
http://spring.io/blog/2015/06/08/cors-support-in-spring-framework