超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【W(wǎng)EB開發(fā)】什么是“跨域”及跨域解決方案

admin
2025年2月21日 16:1 本文熱度 1336
什么是跨域

跨域是指從一個域名的網(wǎng)頁去請求另一個域名的資源。比如,從www.a.com域名的網(wǎng)頁去請求www.b.com域名的資源,只要協(xié)議、域名、端口有任何一個不同,都被當(dāng)作是不同的域,跨域問題通常由瀏覽器的同源策略引起的。

同源策略就是瀏覽器出于安全考慮而制定的,例如數(shù)據(jù)安全,服務(wù)器安全,減少 xss(跨站腳本攻擊),CSRF(跨站請求偽造) 等攻擊。所謂同源,就是協(xié)議,域名,端口號都相同才能請求數(shù)據(jù)。如果是非同源請求發(fā)送后,瀏覽器會攔截響應(yīng)。

  1. 瀏覽器出于安全考慮(數(shù)據(jù)安全,服務(wù)器安全,減少 xss,CSRF 攻擊)  2. https://    www.     abc.com    :8000     /a.html      協(xié)議      子域名     主域名     端口號   路徑  3. 非同源,請求發(fā)送后,瀏覽器會攔截響應(yīng)

跨域解決方案

1.jsonp

  1. 借助 script 標(biāo)簽 src 屬性不受同源策略的限制(經(jīng)常要加載第三方庫等),來發(fā)送請求
  2. 攜帶一個參數(shù) callback 給后端
  3. 后端將數(shù)據(jù)作為 callback 函數(shù)的實參,返回給前端一個 callback 的調(diào)用形式
  4. 瀏覽器接收到 callback 的調(diào)用會自動執(zhí)行全局的callback函數(shù)

代碼具體實現(xiàn)如下:
// 前端<button onclick="handle()">請求</button>
<script>    function jsonp(url, cb) {      return new Promise((resolve, reject) => {
        const script = document.createElement('script')
        // 定義一個全局函數(shù),用來接收后端返回的數(shù)據(jù)        window[cb] = function (data) {          // console.log(data) // 后端返回的數(shù)據(jù)          resolve(data)        }
        script.src = `${url}?cb=${cb}`
        // 將標(biāo)簽加到document.body時,瀏覽器就會發(fā)url請求        document.body.appendChild(script)          // callback('hello world')      })    }
    function handle() {      jsonp('http://localhost:3000', 'callback').then(res => {        console.log(res)      })    } </script>
前端通過一個jsonp函數(shù),傳入請求的url和回調(diào)函數(shù)的名稱cb,然后在jsonp函數(shù)里面創(chuàng)建一個script標(biāo)簽,將該標(biāo)簽的src屬性變?yōu)閡rl后面用?拼接傳入的字符串。
// 后端const http = require('http');
http.createServer((req, res) => {  // 獲取前端傳過來參數(shù)  const query = new URL(req.url, `http://${req.headers.host}`).searchParams
  if (query.get('cb')) {    const cb = query.get('cb')  // 'callback'    const data = 'hello world'    const result = `${cb}("${data}")`   // "callback('hello world')"    res.end(result)  }
}).listen(3000);

后端創(chuàng)建一個http服務(wù)器,解析前端傳過來的callback字符串參數(shù),將數(shù)據(jù)作為參數(shù)返回"callback('hello world')"格式的一個函數(shù)。

缺點:

  • 必須要前后端配合
  • 只能發(fā)送 get 請求
  • 不安全,容易受到xss攻擊

2. CORS(跨資源共享)

服務(wù)器在響應(yīng)頭中后端設(shè)置 Access-Control-Allow-Origin: '域名白名單',告訴瀏覽器允許哪個源進(jìn)行跨域訪問??梢允蔷唧w的域名,也可以是*表示允許所有源。如下

const http = require('http')
const server = http.createServer((req, res) => {  res.writeHead(200, {    'Access-Control-Allow-Origin''*',    // 允許所有域名訪問    // 也可自行設(shè)置指定的域名可以訪問     // 例如: 'Access-Control-Allow-Origin': 'http://192.168.2.1:5500'  })  res.end('hello world');})
server.listen(3000)
還可設(shè)置允許的請求方式和請求頭等。

3.nginx反向代理

前端服務(wù)器和后端服務(wù)器不在同一個域名下, 前端服務(wù)器通過nginx 反向代理來訪問后端服務(wù)器。

服務(wù)器和服務(wù)器之間的通信不存在跨域,可以開一臺中間服務(wù)器(nginx),后端無需改變。前端把請求發(fā)給nginx , nginx 服務(wù)器把請求轉(zhuǎn)發(fā)給后端的服務(wù)器,后端的服務(wù)器響應(yīng)給 nginx 服務(wù)器,nginx 服務(wù)器加上響應(yīng)頭以后,再返回給前端,如下;

4. node 中間件代理

原理同nginx 反向代理,只不過多寫一個node后端,前端服務(wù)器和后端服務(wù)器不在同一個域名下,前端服務(wù)器通過 node 中間件來訪問后端服務(wù)器。

5. websocket

  1. 傳統(tǒng)的前后端通信是基于http協(xié)議的,是單向的,只能從一端發(fā)到另一端,無法雙向通信
  2. websocket 是基于tcp協(xié)議的,是雙向的,可以從一端發(fā)送到另一端,也可以從另一端發(fā)送到一端
  3. socket協(xié)議一旦建立連接,就可以一直保持通信狀態(tài),不需要每次都建立連接,但是會更開銷性能
  4. 天生就可以跨域

// 前端<script>    function WebSocketTest(url, params = {}) {      return new Promise((resolve, reject) => {
        // 創(chuàng)建socket實例對象        const socket = new WebSocket(url)
        // 當(dāng)連接打開時發(fā)送數(shù)據(jù)        socket.onopen = () => {          socket.send(JSON.stringify(params))        }
        // 接收到后端的消息時打印數(shù)據(jù)并解決Promise        socket.onmessage = (event) => {          console.log(event.data)          resolve(event.data)        }      })    }
    WebSocketTest('ws://localhost:3000', { age: 18 }).then(res => {      console.log(res)    })  </script>
后端: 首先安裝ws:npm i ws
// 后端
const WebSocket = require('ws');
// 在 3000 端口上建立 WebSocket 伺服器 (隨時都在線的服務(wù))const ws = new WebSocket.Server({ port: 3000 });
let count = 0
// 監(jiān)聽連接ws.on('connection', (obj) => {  // console.log(obj);  obj.on('message', (msg) => {  // 收到客戶端發(fā)來的消息    // console.log(msg.toString());   // 客戶端傳過來的數(shù)據(jù)    obj.send('收到了')
    setInterval(() => {      count++      obj.send(count)    }, 2000)
  })})

6. postMessage

當(dāng)父級頁面和iframe頁面不在同一個域名下,他們之間的數(shù)據(jù)傳輸也存在跨域問題,父級頁面和iframe頁面之間可以通過posMessage來通信。

<h2>首頁</h2><iframe id="frame" src="http://127.0.0.1:5500/%E8%B7%A8%E5%9F%9F/postMessage/detail.html"frameborder="0" width="800" height="500"></iframe>
<script>    let obj = { name'阿杰'age18 }
    document.getElementById('frame').onload = function () {      this.contentWindow.postMessage(obj, 'http://127.0.0.1:5500'// 向iframe發(fā)送消息
      window.onmessage = function (e) { // 接收iframe發(fā)送的消息        console.log(e.data);      }
    }  </script>
<h3>詳情頁 --- <span id="title"></span></h3>
<script>    const title = document.getElementById("title");    window.onmessage = function (e) {  // 接收父級頁面?zhèn)鬟^來的數(shù)據(jù)      // console.log(e.data);      title.innerText = e.data.age;      e.source.postMessage("阿杰 20了", e.origin)  // 向父級頁面發(fā)送消息    }  </script>

7.document.domain

通過設(shè)置document.domain來允許同一主域名下的跨域通信,原理同postMessage,但是谷歌禁止了這種方法

總結(jié)

跨域是指從一個域名的網(wǎng)頁去請求另一個域名的資源。只要協(xié)議、域名、端口有任何一個不同,都被當(dāng)作是不同的域??缬騿栴}通常由瀏覽器的同源策略引起,同源策略是為了保證用戶信息的安全,防止惡意網(wǎng)站竊取數(shù)據(jù)

同源策略瀏覽器出于安全考慮(數(shù)據(jù)安全,服務(wù)器安全,減少 xss,CSRF 攻擊)而制定的一種只有協(xié)議、域名、端口號都相同才能請求數(shù)據(jù)的規(guī)定,非同源請求發(fā)送后,瀏覽器會攔截響應(yīng)。

跨域方案

  1. jsonp(script標(biāo)簽的src屬性不受同源策略的限制)
  2. CORS(跨資源共享,通知瀏覽器哪些域名可以訪問)
  3. nginx 反向代理
  4. node 中間件代理
  5. websocket(socket協(xié)議可以保持長時間的連接,不受同源的限制,天生可以跨域)
  6. postMessage(父級頁面和iframe頁面之間可以通過posMessage來通信)
  7. document.domain(通過設(shè)置來允許同一主域名下的跨域通信,谷歌禁止了)

常見的解決方案有:CORS適用于需要支持多種HTTP方法(如GET、POST、PUT等)的現(xiàn)代Web應(yīng)用,nginx 反向代理適用于前后端分離的項目,可以在服務(wù)器層面統(tǒng)一處理跨域問題。


該文章在 2025/2/21 16:01:37 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved