跨域問題?如何解決?

来源:https://www.cnblogs.com/one-xiaoqiang/archive/2023/10/05/17743702.html
-Advertisement-
Play Games

跨域問題是指在瀏覽器上運行的Web應用程式試圖通過XMLHttpRequest或Fetch API等方式向不同源(功能變數名稱、協議或埠)的伺服器發送請求時,瀏覽器會根據同源策略(Same-Origin Policy)阻止這種行為。同源策略是一種安全機制,用於限制來自不同源的頁面對當前頁面的訪問。它可以防... ...


前言

在當今互聯網時代,前端開發中經常會遇到跨域問題,即瀏覽器禁止向不同源的伺服器發送請求。這意味著在開發過程中,如果我們的前端代碼需要與其他功能變數名稱下的介面進行通信,我們將面臨無法直接發送請求的困境。跨域問題的存在給開髮帶來了不少麻煩,然而,在跨域問題之下,我們也發現瞭解決的方法。本篇博客將為大家介紹如何解決跨域問題的一些有效策略和技巧。

什麼是跨域問題

跨域問題是指在瀏覽器上運行的Web應用程式試圖通過XMLHttpRequest或Fetch API等方式向不同源(功能變數名稱、協議或埠)的伺服器發送請求時,瀏覽器會根據同源策略(Same-Origin Policy)阻止這種行為。同源策略是一種安全機制,用於限制來自不同源的頁面對當前頁面的訪問。它可以防止惡意的網站通過跨域請求獲取用戶的個人信息或進行未授權操作。

同源策略要求請求的協議、功能變數名稱和埠號必須完全相同才被認為是同源。例如,一個頁面從 http://example.com/index.html 發出的請求,如果請求的目標地址是 http://api.example.com/data,由於協議、功能變數名稱和埠號不一致,就會被瀏覽器阻止。在這種情況下,瀏覽器會拋出一個跨域錯誤,導致請求失敗。

如何解決

  1. JSONP(JSON with Padding):利用 script 標簽的跨域特性,通過動態創建 script 標簽並設置其 src 屬性為跨域的 URL,伺服器端返回的響應數據需要用特定的格式包裹起來,並通過回調函數返回給客戶端。這種方式只適用於 GET 請求,並且需要伺服器端支持返回 JSONP 格式。

  2. CORS(跨域資源共用):在伺服器端設置相應的響應頭,允許跨域請求。通常在伺服器端設置 Access-Control-Allow-Origin 頭部,指定允許的來源功能變數名稱,即可實現跨域請求的許可。CORS 支持各種 HTTP 請求方法,並且更加靈活和安全。

  3. 代理伺服器:在同源策略限制下,可以通過在同功能變數名稱下的伺服器上設置一個代理伺服器,將客戶端請求轉發到目標伺服器,再將相應的結果返回給客戶端。客戶端只需要與代理伺服器通信,而不是直接與目標伺服器通信,間接實現了跨域請求。

  4. WebSocket:WebSocket 是一種基於 TCP 協議的全雙工的通信協議,它不受同源策略的限制,在建立連接後,客戶端與伺服器之間可以直接進行雙向通信。因此,可以利用 WebSocket 實現跨域通信。

在Spring中怎麼解決跨域問題

  • 使用 @CrossOrigin 註解:在控制器類或控制器方法上使用@CrossOrigin註解來允許指定的功能變數名稱進行跨域訪問。代碼示例如下:

在控制器類上使用@CrossOrigin註解:

@RestController
@CrossOrigin //該類所有方法允許跨域
public class AccountController {
    //註冊 API 介面
    @PostMapping("/v1/user/register")
    public ResultVo<String> register(AccountDto accountDto){
        System.out.println(accountDto);
        return ResultVo.success("register_ok");
    }
}

在控制器類方法上使用@CrossOrigin註解:

@RestController
public class AccountController {
    //註冊 API 介面
    @PostMapping("/v1/user/register")
    @CrossOrigin //該方法允許跨域
    public ResultVo<String> register(AccountDto accountDto){
        System.out.println(accountDto);
        return ResultVo.success("register_ok");
    }
}
  • 在配置文件中來自定義跨域配置
<!-- 配置CORS跨域 -->
    <mvc:cors>
        <mvc:mapping path="/**"/>
    </mvc:cors>

總結

跨域問題是在Web開發中常遇到的挑戰之一。當頁面上的JavaScript代碼嘗試通過XMLHttpRequest或Fetch API等方式向不同功能變數名稱、協議或埠的伺服器發送請求時,瀏覽器會根據同源策略(Same-Origin Policy)阻止這種行為。解決跨域問題有多種方法,常用的包括JSONP、CORS、代理伺服器等。在Spring框架中,可以使用@CrossOrigin註或者配置全局跨域設置來處理跨域請求。選擇不同的解決方案取決於項目需求和後端服務的支持情況。通過正確的解決方案,可以保證數據通信的安全性和穩定性,提高開發效率和用戶體驗。跨域問題是web開發中不可忽視的問題,瞭解解決方案對於前端開發者至關重要。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【Flutter】如何優美地實現一個懸浮NavigationBar 最近寫代碼的時候遇到了一個如下的需求: 整體來說,底部的條是一個浮動的懸浮窗,有如下的三個按鈕: 點擊左邊的要進入“主頁” 點擊中間的按鈕要進行頁面跳轉,能夠進入“創作頁” 點擊右邊的按鈕切換到“個人中心”頁 使用Overlay來實 ...
  • 經過 Adobe 工程師多年來的努力,並與 Chrome 等瀏覽器供應商密切合作,通過 WebAssembly + Emscripten、Web Components + Lit、Service Workers + Workbox 和新的 Web API 的支持,終於在近期推出了 Web 版 Pho ...
  • 主要增加對容器創建 MySQL、Mongo 時對 數據文件,日誌,配置,網路,時區,埠映射,密碼 的配置,更貼合生產環境的實際使用 ...
  • 軟體設計原則 GRASP 通用職責分配軟體模式 來自 Craig Larman 的軟體設計書《UML 和模式應用》,Larman 在書中提出軟體設計的關鍵任務是職責分配,並提煉總結出 9 種 (5 種核心 +4 種擴展) 軟體職責分配模式,這些模式是比 GoF 設計模式更抽象的元模式。 信息專家 ( ...
  • 本文記錄了穩定性摸排過程中的一些思考和沉澱。 前言 在之前寫了篇文章《上線十年,81萬行Java代碼的老系統如何重構》,在文章後有同學留言問“這麼複雜的改動,質量是如何應對的”,是一個特別好的問題,當時只是從現有的一些監控、測試、卡口手段上進行了回答。但在回答過程當中就在思考一個問題,交接過來的老代 ...
  • 前言 在日常的開發中,我們經常使用key-value鍵值對的HashMap,其使用哈希表實現,用空間換取時間,提升查詢性能 但在多線程的併發場景中,HashMap並不是線程安全的 如果想使用線程安全的,可以使用ConcurrentHashMap、HashTable、Collections.synch ...
  • Pattern模式是Dart 3.0發佈的3個高級特性之一,在第09天我們學習了模式的概覽和用法,對模式的強大之處有了基本的認識,今天我們來看看Dart中的全部模式類型,總共有15種,它們包括邏輯或、邏輯與、關係、值轉換、空檢測、空斷言、常量、變數、標識符、括弧、List列表、Map映射、Recor... ...
  • 簡介 SSE 的全稱是 Server Sent Events,即伺服器推送事件。它是一種基於 HTTP 的伺服器到客戶端的單向(半雙工)通信機制,使伺服器能夠主動將實時數據推送給客戶端,而不需要客戶端多次發起請求。 官方文檔:https://developer.mozilla.org/en-US/d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...