Springboot系列-CORS跨域問題
前言:項目開發中,若採用前後端分離的方式很容易出現跨域問題(,那麼什麼是跨域問題,瀏覽器的同源策略是如何解決的
同源策略
同源策略是由 Netscape 提出的一個著名的安全策略,它是瀏覽器最核心也最基本的安全功能,比如現在所有支持 JavaScript 的瀏覽器都會使用這個策略。所謂同源是指協議、域名以及端口要相同
同源策略是基於安全方面的考慮提出來的,但是在開發中,由於各種原因又經常有跨域的需求,傳統的跨域方案是 JSONP,但是JSONP有一個很大的侷限性,就是隻支持 GET 請求,不支持其他類型的請求,而 CORS(跨域源資源共享)(Cross-origin resource sharing)是一個 W3C 標準的瀏覽器技術的規範,可以避開瀏覽器的同源策略,這是 JSONP 模式的現代版
跨域問題
那麼如何通過springboot來解決跨域問題呢?
首先創建兩個簡單的springboot項目:
(1)provider 提供服務,配置端口8080,提供兩個hello接口,分別爲get ,post 如下:
@RestController
public class ProviderController {
@GetMapping("/hello")
public String hello1(){
return "Get hello";
}
@PostMapping("/hello")
public String hello2(){
return "Post hello";
}
}
(2) consumer消費服務 ,配置端口8081 ,在resource下面static下創建hello.html文件,發送ajax請求,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
</div>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<input type="button" onclick="btnClick()" value="get_button">
<input type="button" onclick="btnClick2()" value="post_button">
<script>
function btnClick() {
$.get('http://localhost:8080/hello', function (msg) {
$("#app").html(msg);
});
}
function btnClick2() {
$.post('http://localhost:8080/hello', function (msg) {
$("#app").html(msg);
});
}
</script>
</body>
</html>
(3)分別啓動provider和customer項目,發送兩個按鈕請求,打開瀏覽器控制檯運行結果如下:
可以看到,由於同源策略的限制,請求無法發送成功
解決跨域
接下來可以使用 CORS 實現跨域,首先可以通過 @CrossOrigin 註解配置某一個方法接受某一個域的請求,在 provider 中如何配置如下:
@RestController
public class ProviderController {
@CrossOrigin(value = "http://localhost:8081")
@GetMapping("/hello")
public String hello1(){
return "Get hello";
}
@CrossOrigin(value = "http://localhost:8081")
@PostMapping("/hello")
public String hello2(){
return "Post hello";
}
}
此上@CrossOrigin註解表示兩個接口均接受來自 http://localhost:8081 的請求,配置完成後重新啓動provider,發送請求,consumer就可以拿到數據,此時打開瀏覽器網絡控制檯如下:
這個表示服務端願意接收來自 http://localhost:8081 的請求,如果每個接口都要加上@CrossOrigin的話過於繁瑣,所以在 Spring Boot 中,還可以通過全局配置解決這個問題,全局配置可在 SpringMVC 的配置類中重寫 addCorsMappings 方法即可,如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8081")
.allowedMethods("*")
.allowedHeaders("*");
}
}
/** 表示此項目所有方法都會去處理跨域請求,allowedMethods 表示允許通過的請求數,allowedHeaders 則表示允許的請求頭
結語:關於在springboot中如何處理跨域問題,就介紹到這,但是關於跨域帶來的弊端還是存在的,常見的就是 CSRF(Cross-site request forgery)跨站請求僞造,類似於是一種挾制用戶在當前已登錄的 Web 應用程序上執行非本意的操作的攻擊方法,這裏不再多說…