Spring Boot中通過CORS解決跨域問題
同源策略
同源策略是由Netscape提出的一個著名的安全策略顷级,它是瀏覽器最核心也最基本的安全功能烫幕,現(xiàn)在所有支持JavaScript的瀏覽器都會使用這個策略策严。所謂同源是指協(xié)議轩端、域名以及端口要相同遵绰。同源策略是基于安全方面的考慮提出來的吻谋,這個策略本身沒問題忠蝗,但是我們在實際開發(fā)中,由于各種原因又經(jīng)常有跨域的需求漓拾,傳統(tǒng)的跨域方案是JSONP什湘,JSONP雖然能解決跨域但是有一個很大的局限性长赞,那就是只支持GET請求,不支持其他類型的請求闽撤,而今天我們說的CORS(跨域源資源共享)(CORS蛋铆,Cross-origin resource sharing)是一個W3C標(biāo)準(zhǔn)踢械,它是一份瀏覽器技術(shù)的規(guī)范,提供了Web服務(wù)從不同網(wǎng)域傳來沙盒腳本的方法,以避開瀏覽器的同源策略明吩,這是JSONP模式的現(xiàn)代版僵腺。
在Spring框架中茬高,對CORS提供了相應(yīng)的解決方案个盆。
實踐
首先創(chuàng)建兩個普通的SpringBoot項目,這個就不用我多說舍沙,第一個命名為provider提供服務(wù)近上,第二個命名為consumer消費服務(wù),第一個配置端口為8080拂铡,第二個配置配置為8081壹无,然后在provider上提供hello接口。
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
在consumer的resources/static目錄下創(chuàng)建一個html文件感帅,發(fā)送一個簡單的ajax請求斗锭,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery3.3.1.js"></script>
</head>
<body>
<div id="app"></div>
<input type="button" value="GET" onclick="getData()">
<script>
function getData() {
$.get('http://localhost:8080/hello',function (msg) {
$("#app").html(msg);
});
}
</script>
</body>
</html>
可通過@CrossOrigin注解實現(xiàn)某個方法或某個類的跨域,或在WebMVCConfig中配置全局跨域失球,具體代碼如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:8081")
.allowedHeaders("*").allowedMethods("*").maxAge(30*1000);
}
}
/**表示本應(yīng)用的所有方法都會去處理跨域請求岖是,allowedMethods表示允許通過的請求數(shù),allowedHeaders則表示允許的請求頭实苞。經(jīng)過這樣的配置之后豺撑,就不必在每個方法上單獨配置跨域了。
觀察瀏覽器請求網(wǎng)絡(luò)控制臺黔牵,可以看到響應(yīng)頭中多了如下信息:
這個表示服務(wù)端愿意接收來自http://localhost:8081的請求前硫,拿到這個信息后,瀏覽器就不會再去限制本次請求的跨域了荧止。