最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年03月11日 10:49:40   作者:蘇三說技術  
很多小伙伴第一次遇到跨域問題,大概率會一臉懵逼,這篇文章小編將為大家介紹一下前后端解決跨域問題的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標準,后端只需在響應頭里加幾個字段,告訴瀏覽器“這個接口我允許誰訪問”。

后端代碼示例(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);
    }
}

關鍵響應頭:

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

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

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

注意坑點:

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

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

2.2 JSONP

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

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

前端代碼:

function handleUserData(data) {
    console.log("收到數(shù)據(jù):", data);
}
 
// 動態(tài)創(chuàng)建script標簽
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ù)包進回調(diào)函數(shù)里
    return callback + "(" + new Gson().toJson(user) + ")";
}

輸出結果:

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

缺點:

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

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

2.3 Nginx反向代理

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

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

Nginx配置示例:

server {
    listen 80;
    server_name localhost;
 
    location /api {
        # 轉發(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轉發(fā)

優(yōu)點:

前后端代碼零侵入。

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

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

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

和Nginx思路類似,但更適合微服務場景,直接在網(wǎng)關層加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);
});

總結

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

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

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

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

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

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

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

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

相關文章

  • JAVA核心知識之ConcurrentHashMap源碼分析

    JAVA核心知識之ConcurrentHashMap源碼分析

    這篇文章主要介紹了JAVA核心知識之ConcurrentHashMap源碼分析,想了解ConcurrentHashMap的同學一定要看啊
    2021-04-04
  • SpringBoot圖片上傳和訪問路徑映射

    SpringBoot圖片上傳和訪問路徑映射

    這篇文章主要為大家詳細介紹了SpringBoot圖片上傳和訪問路徑映射,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java實現(xiàn)肯德基收銀系統(tǒng)

    java實現(xiàn)肯德基收銀系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)肯德基收銀系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java中類與對象的使用詳情

    java中類與對象的使用詳情

    這篇文章主要介紹了java中類與對象的使用詳情,面向對象是通過類和對象去描述和代表萬千事物對象的,首先我們需要知道如何去定義一個類,下面文章我們詳細介紹兩者的使用方法,需要的小伙伴可以參考一下
    2022-05-05
  • spring boot 如何請求后綴匹配

    spring boot 如何請求后綴匹配

    這篇文章主要介紹了spring boot 請求后綴匹配的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java中的各種修飾符作用及范圍

    java中的各種修飾符作用及范圍

    這篇文章主要介紹了java中的各種修飾符作用及范圍,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Redis Java 集成到 Spring Boot的詳細過程

    Redis Java 集成到 Spring Boot的詳細過程

    本文介紹了如何使用SpringBoot連接Redis,并展示了如何配置Redis服務地址、創(chuàng)建Controller類以及進行基本的Redis操作,如字符串、列表、集合、哈希和有序集合,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • @Configuration注解失效問題及解決方案

    @Configuration注解失效問題及解決方案

    SpringBoot配置類失效問題排查與解決,詳細描述@Configuration注解失效原因及解決方法,強調(diào)配置類掃描包路徑設置的重要性
    2026-06-06
  • Maven打包jar生成javadoc文件和source文件代碼實例

    Maven打包jar生成javadoc文件和source文件代碼實例

    這篇文章主要介紹了Maven打包jar生成javadoc文件和source文件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • jstack和線程dump實例解析

    jstack和線程dump實例解析

    這篇文章主要介紹了jstack和線程dump實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

德惠市| 聂荣县| 隆德县| 吴忠市| 瑞金市| 大名县| 高青县| 界首市| 甘德县| 新巴尔虎右旗| 禄劝| 梅州市| 威宁| 吉林省| 含山县| 桐梓县| 达拉特旗| 定襄县| 玉环县| 江阴市| 太仆寺旗| 金坛市| 乳山市| 宁安市| 扶余县| 确山县| 中方县| 乐至县| 疏附县| 乡城县| 武城县| 射阳县| 同江市| 开平市| 资兴市| 内江市| 清丰县| 肥西县| 连江县| 枞阳县| 中卫市|