亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前后端解決跨域問題的6種方案分享

 更新時間:2025年03月11日 10:49:40   作者:蘇三說技術(shù)  
很多小伙伴第一次遇到跨域問題,大概率會一臉懵逼,這篇文章小編將為大家介紹一下前后端解決跨域問題的6種方法,希望對大家有一定的幫助

1 什么是跨域問題

很多小伙伴第一次遇到跨域問題,大概率會一臉懵逼:“我后端接口明明通了,Postman也能調(diào),為啥瀏覽器就報紅字?”

其實這事兒得怪瀏覽器的“同源策略”(Same-Origin Policy)。

簡單說,瀏覽器覺得“不同源的請求都是耍流氓”。

比如你的前端跑在http://localhost:8080。

而后端在https://api.xxx.com:8000。

只要協(xié)議、域名、端口任何一個不同,就會被瀏覽器直接掐斷。

舉個栗子:

// 前端代碼(http://localhost:8080)
fetch('http://api.xxx.com:8000/user')
  .then(res => res.json())
  .then(data => console.log(data));  
// 瀏覽器控制臺報錯:  
// Access to fetch from 'http://localhost:8080' has been blocked by CORS policy...

這時候,你就需要“跨域解決方案”來幫瀏覽器松綁了!

那么,如何解決跨域問題呢?

2 解決跨域問題的方案

2.1 CORS(跨域資源共享)

適用場景:前后端分離項目、接口需要兼容多種客戶端。

CORS是W3C標(biāo)準(zhǔn),后端只需在響應(yīng)頭里加幾個字段,告訴瀏覽器“這個接口我允許誰訪問”。

后端代碼示例(Spring Boot版):

// 方法1:直接懟注解(適合單個接口)
@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/user")
public User getUser() { ... }
 
// 方法2:全局配置(一勞永逸)
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8080")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

關(guān)鍵響應(yīng)頭:

Access-Control-Allow-Origin: http://localhost:8080(允許的源)

Access-Control-Allow-Methods: GET,POST(允許的方法)

Access-Control-Allow-Credentials: true(允許帶Cookie)

注意坑點:

如果用了allowCredentials(true),allowedOrigins不能為*(必須明確指定域名)。

復(fù)雜請求(比如Content-Type是application/json)會先發(fā)一個OPTIONS預(yù)檢請求,記得處理!

2.2 JSONP

適用場景:老項目兼容、只支持GET請求(比如調(diào)用第三方地圖API)。

JSONP利用**<script>標(biāo)簽沒有跨域限制**的特性,讓后端返回一段JS代碼。

前端代碼:

function handleUserData(data) {
    console.log("收到數(shù)據(jù):", data);
}
 
// 動態(tài)創(chuàng)建script標(biāo)簽
const script = document.createElement('script');
script.src = 'http://api.xxx.com:8000/user?callback=handleUserData';
document.body.appendChild(script);

后端代碼:

@GetMapping("/user")
public String jsonp(@RequestParam String callback) {
    User user = new User("Tony", 30);
    // 把數(shù)據(jù)包進(jìn)回調(diào)函數(shù)里
    return callback + "(" + new Gson().toJson(user) + ")";
}

輸出結(jié)果:

handleUserData({"name":"Tony","age":30})  

缺點:

只支持GET(傳參長度有限)。

容易被XSS攻擊(畢竟得信任第三方腳本)。

2.3 Nginx反向代理

適用場景:生產(chǎn)環(huán)境部署、微服務(wù)網(wǎng)關(guān)統(tǒng)一處理。

直接把跨域問題甩給Nginx,讓瀏覽器以為所有請求都是同源的。

Nginx配置示例:

server {
    listen 80;
    server_name localhost;
 
    location /api {
        # 轉(zhuǎn)發(fā)到真實后端
        proxy_pass http://api.xxx.com:8000;
        # 解決跨域
        add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
        add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Content-Type';
    }
}

此時前端請求地址改成同源:

fetch('/api/user')  // 實際訪問 http://localhost/api/user → 被Nginx轉(zhuǎn)發(fā)

優(yōu)點:

前后端代碼零侵入。

能隱藏真實接口地址(安全加分)。

2.4 網(wǎng)關(guān)層統(tǒng)一處理

適用場景:Spring Cloud Gateway、Kong等API網(wǎng)關(guān)。

和Nginx思路類似,但更適合微服務(wù)場景,直接在網(wǎng)關(guān)層加CORS配置。

Spring Cloud Gateway配置:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowed-origins: "http://localhost:8080"
            allowed-methods: "*"
            allowed-headers: "*"
            allow-credentials: true

2.5 WebSocket

適用場景:實時通信需求(聊天室、股票行情)。

WebSocket協(xié)議沒有跨域限制(因為握手階段走HTTP,后續(xù)升級為長連接)。

前端代碼:

const socket = new WebSocket('ws://api.xxx.com:8000/ws');
socket.onmessage = (event) => {
    console.log('收到消息:', event.data);
};

后端代碼(Spring Boot):

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws");
    }
}

2.6 PostMessage

適用場景:頁面與iframe、彈窗之間的跨域通信。

通過window.postMessage實現(xiàn)不同窗口間的數(shù)據(jù)傳遞。

父頁面(http://parent.com):

const childWindow = window.open('http://child.com');
childWindow.postMessage('我是你爹', 'http://child.com');

子頁面(http://child.com):

window.addEventListener('message', (event) => {
    if (event.origin !== 'http://parent.com') return; // 驗證來源
    console.log('收到爹的消息:', event.data);
});

總結(jié)

簡單粗暴:開發(fā)環(huán)境用CORS注解。

生產(chǎn)環(huán)境:優(yōu)先Nginx/網(wǎng)關(guān)統(tǒng)一處理,避免每個服務(wù)配一遍。

老項目兼容:JSONP勉強能用,但別長期依賴。

實時場景:直接上WebSocket,順便解決通信問題。

安全第一:Access-Control-Allow-Origin盡量別寫*,白名單要用精確域名。

最后提醒溫馨提醒一下:跨域問題本質(zhì)是瀏覽器行為,和HTTP協(xié)議無關(guān)。

如果你用Postman,發(fā)送curl請求,測試沒問題,但瀏覽器報錯,別懷疑人生,這可能是前端的鍋!

以上就是前后端解決跨域問題的6種方案分享的詳細(xì)內(nèi)容,更多關(guān)于前后端解決跨域問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java對象和JSON字符串之間的轉(zhuǎn)換方法(全網(wǎng)最清晰)

    Java對象和JSON字符串之間的轉(zhuǎn)換方法(全網(wǎng)最清晰)

    這篇文章主要介紹了如何在Java中使用Jackson庫將對象轉(zhuǎn)換為JSON字符串,并提供了一個簡單的工具類示例,該工具類支持基本的轉(zhuǎn)換功能,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-02-02
  • java8 stream自定義分組求和并排序的實現(xiàn)

    java8 stream自定義分組求和并排序的實現(xiàn)

    這篇文章主要介紹了java8 stream自定義分組求和并排序的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • IntelliJ IDEA基于Scala實現(xiàn)Git檢查工具

    IntelliJ IDEA基于Scala實現(xiàn)Git檢查工具

    這篇文章主要介紹了如何使用Scala實現(xiàn)自定義的Git檢查工具,大家可以基于本文的示例進(jìn)行擴(kuò)展與實現(xiàn),也可以進(jìn)行其他應(yīng)用方向的嘗試,感興趣的可以了解下
    2023-08-08
  • Springboot vue導(dǎo)出功能實現(xiàn)代碼

    Springboot vue導(dǎo)出功能實現(xiàn)代碼

    這篇文章主要介紹了Springboot vue導(dǎo)出功能實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • IntelliJ IDEA優(yōu)化配置的實現(xiàn)

    IntelliJ IDEA優(yōu)化配置的實現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA優(yōu)化配置的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot項目部署到Tomcat的最新步驟

    SpringBoot項目部署到Tomcat的最新步驟

    通過使用Spring Boot應(yīng)用程序,我們可以創(chuàng)建一個war文件來部署到Web服務(wù)器中,這篇文章主要給大家介紹了關(guān)于SpringBoot項目部署到Tomcat的最新步驟,需要的朋友可以參考下
    2024-01-01
  • 詳談java編碼互轉(zhuǎn)(application/x-www-form-urlencoded)

    詳談java編碼互轉(zhuǎn)(application/x-www-form-urlencoded)

    下面小編就為大家?guī)硪黄斦刯ava編碼互轉(zhuǎn)(application/x-www-form-urlencoded)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • java如何獲取map中value的最大值

    java如何獲取map中value的最大值

    這篇文章主要介紹了java如何獲取map中value的最大值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 教你怎么用SpringBoot整合Swagger作為API

    教你怎么用SpringBoot整合Swagger作為API

    這篇文章主要介紹了教你怎么用SpringBoot整合Swagger作為API,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java設(shè)計模式中代理模式應(yīng)用詳解

    Java設(shè)計模式中代理模式應(yīng)用詳解

    代理模式(Proxy Parttern)為一個對象提供一個替身,來控制這個對象的訪問,即通過代理對象來訪問目標(biāo)對象。本文將通過示例詳細(xì)講解一下這個模式,需要的可以參考一下
    2022-11-11

最新評論