Springboot系列-CORS跨域問題

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 應用程序上執行非本意的操作的攻擊方法,這裏不再多說…

發佈了115 篇原創文章 · 獲贊 59 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章