什麼是跨域?及跨域解決方法

来源:https://www.cnblogs.com/yingzi1028/archive/2022/09/07/16665766.html
-Advertisement-
Play Games

什麼是跨域 當一個請求url的協議、功能變數名稱、埠三者之間任意一個與當前頁面url不同即為跨域。 跨域指的是瀏覽器不能執行其它網站的腳本。是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。 有一點必須要註意:跨域並不是請求發不出去,請求能發出去,服務端能收到請求並正常返回結果, ...


什麼是跨域

當一個請求url的協議、功能變數名稱、埠三者之間任意一個與當前頁面url不同即為跨域。

跨域指的是瀏覽器不能執行其它網站的腳本。是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。

有一點必須要註意:跨域並不是請求發不出去,請求能發出去,服務端能收到請求並正常返回結果,只是結果被瀏覽器攔截了。之所以會跨域,是因為受到了同源策略的限制,同源策略要求源相同才能正常進行通信,即協議、功能變數名稱、埠號都完全一致。

什麼是同源策略?

協議號 - 功能變數名稱 - 埠號 ,只有當這三個條件同時滿足相同時,我們就稱之為符合同源策略,同源策略也可以看做是一個協議。

https://  www.baidu.com   :8080    /test
協議號         功能變數名稱        埠號    路徑

通常我們導航的url都是由這四部分組成的。

同源策略限制從一個源載入的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用於隔離潛在惡意文件的關鍵的安全機制。它的存在可以保護用戶隱私信息,防止身份偽造等(讀取Cookie)。

同源策略限制行為:

  • CookieLocalStorageIndexDB無法讀取;
  • 無法獲得非同源網頁的 DOM節點;
  • AJAX請求不能發送;
但是有三個標簽允許跨域載入資源:
<img src=XXX> 
<link href=XXX> 
<script src=XXX>

跨域解決方法

1.Proxy代理

webpack本地代理

【前端解決:只適用於本地開發環境,上線瞭解決不了,直接把dist放在後端伺服器中】

Proxy通過服務端介面轉發來實現對於跨域問題的問題,因為HTTP同源策略只在瀏覽器中生效。 這裡介紹幾種不同Proxy代理方法:

在vue.config.js中利用 WebpackDevServer 配置本地代理

// 配置實例:
module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'xxx',
        pathRewrite: {
          '^/api': ''
        },
        changeOrigin: true
      }
    }
  }
};

註意:項目上線需要把打包後的文件放在伺服器上運行,而不是啟動腳手架運行,也就沒有內置web伺服器做代理,所以此方式只適用於開發測試階段

上線時需要使用nginx代理或者伺服器配置cors(每種語言有自己不同的配置方式)

參考:Vue中如何解決跨域問題

Nginx反向代理

server {
 
    #nginx監聽所有localhost:8080埠收到的請求
    listen       8080;
    server_name  localhost;
 
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    #localhost:8080 會被轉發到這裡
    #同時, 後端程式會接收到 "192.168.25.20:8088"這樣的請求url
    location / {
        proxy_pass http://192.168.25.20:8088;
    }
    #localhost:8080/api/ 會被轉發到這裡
    #同時, 後端程式會接收到 "192.168.25.20:9000/api/"這樣的請求url
    location /api/ {
        proxy_pass http://192.168.25.20:9000;
    }
    error_page 404 /404.html;
        location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

參考:什麼是跨域?及7種跨域解決方法

2.跨域資源共用 CORS

目前最主流、最簡單的方案,直接讓後端設置響應頭,允許資源共用就ok了

CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標準,屬於跨源 AJAX 請求的根本解決方法。

1、普通跨域請求:只需伺服器端設置Access-Control-Allow-Origin
2、帶cookie跨域請求:前後端都需要進行設置

【前端設置】根據xhr.withCredentials欄位判斷是否帶有cookie

vue框架

  • vue-resource
    Vue.http.options.credentials = true
  •  axios
    axios.defaults.withCredentials = true

【服務端設置】

伺服器端對於CORS的支持,主要是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,就可以允許Ajax進行跨域的訪問。若後端設置成功,前端瀏覽器控制台則不會出現跨域報錯信息,反之,說明沒設成功。

Java後臺

/*
 * 導入包:import javax.servlet.http.HttpServletResponse;
 * 介面參數中定義:HttpServletResponse response
 */
 
// 允許跨域訪問的功能變數名稱:若有埠需寫全(協議+功能變數名稱+埠),若沒有埠末尾不用加'/'
response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com"); 
 
// 允許前端帶認證cookie:啟用此項後,上面的功能變數名稱不能為'*',必須指定具體的功能變數名稱,否則瀏覽器會提示
response.setHeader("Access-Control-Allow-Credentials", "true"); 
 
// 提示OPTIONS預檢時,後端需要設置的兩個常用自定義頭
response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");

參考:什麼是跨域?及7種跨域解決方法

3.JSONP

JSONP 是伺服器與客戶端跨源通信的常用方法。最大特點就是簡單適用,相容性好(相容低版本IE),缺點是只支持get請求,不支持post請求。

核心思想:網頁通過添加一個<script>元素,向伺服器請求 JSON 數據,伺服器收到請求後,將數據放在一個指定名字的回調函數的參數位置傳回來。

this.$http.jsonp('http://www.domain2.com:8080/login', {
    params: {},
    jsonp: 'handleCallback'
}).then((res) => {
    console.log(res); 
})

 

作者:愛喝酸奶的吃貨出處:http://www.cnblogs.com/yingzi1028/ 本博客文章大多為原創,轉載請請在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目管理構建工具——Maven(基礎篇) 在前面的內容中我們學習了JDBC並且接觸到了jar包概念 在後面我們的實際開發中會接觸到很多jar包,jar包的導入需要到互聯網上進行就會導致操作繁瑣 Maven在解決了jar包導入繁雜問題的同時,也提供了一套通用的管理和構建Java項目的一系列操作 Mav ...
  • 近年來隨著物聯網技術以及農業自動化應用水平的不斷發展,基於“互聯網+”項目經驗日漸豐富,通過感測器採集對應的信息再通過一些組態軟體類實現自動運轉、自動控制的智能大棚勢在必得。 ...
  • 上傳IPA到iTunes Connect 上一篇我介紹瞭如何在iTunes Connect里準備應用。最後在這篇文章里我會簡單介紹下如何來上傳IPA到iTunes Connect。 登陸iTunes Connect,進入Manage Your Applications頁面後,點擊你創建的應用圖標,進 ...
  • DanceCC提出了一套專門的方案。方案原理基於LLDB Plugin,利用Fishhook,從LLDB的Script Bridge API層面攔截Xcode對LLDB調用,以此來進行耗時監控統計。 ...
  • HMS Core應用內支付服務(In-App Purchases,IAP)為應用提供便捷的應用內支付體驗和簡便的接入流程。開發者的應用集成IAP SDK後,調用IAP SDK介面,啟動IAP收銀台,即可實現應用內支付。 通過應用內支付服務,用戶可以在應用內購買各種類型的虛擬商品,包括一次性商品(包括 ...
  • 最近有個需求,就是上傳圖片的時候,圖片過大,需要壓縮一下圖片再上傳。 需求雖然很容易理解,但要做到,不是那麼容易的。 這裡涉及到的知識有點多,不多說,本篇博客有點重要呀! 一、圖片URL轉Blob(圖片大小不變) 註意點:圖片不能跨域!!! 方式一:通過XHR請求獲取 function urlToB ...
  • 本文是深入淺出 ahooks 源碼系列文章的第十八篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 簡介 提供虛擬化列表能力的 Hook,用於解決展示海量數據渲染時首屏渲染緩慢和滾動卡頓問題。 詳情可見官網,文章源代碼可以點擊這裡。 實現原理 其實現原理監聽外部容 ...
  • 每日3題 25 以下代碼執行後,控制臺中的輸出內容為? let a = { i: 0, [Symbol.toPrimitive]: () => ++a.i, }; console.log(a == 1 && a == 2 && a == 3); 26 變數 a 會被 GC 嗎,為什麼? functi ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...