午夜视频在线观看区二区-午夜视频在线观看视频-午夜视频在线观看视频在线观看-午夜视频在线观看完整高清在线-午夜视频在线观看网站-午夜视频在线观看亚洲天堂

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

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

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

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

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

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

跨域解決方案

1.jsonp

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

代碼具體實(shí)現(xiàn)如下:
// 前端<button onclick="handle()">請(qǐng)求</button>
<script>    function jsonp(url, cb) {      return new Promise((resolve, reject) => {
        const script = document.createElement('script')
        // 定義一個(gè)全局函數(shù),用來接收后端返回的數(shù)據(jù)        window[cb] = function (data) {          // console.log(data) // 后端返回的數(shù)據(jù)          resolve(data)        }
        script.src = `${url}?cb=${cb}`
        // 將標(biāo)簽加到document.body時(shí),瀏覽器就會(huì)發(fā)url請(qǐng)求        document.body.appendChild(script)          // callback('hello world')      })    }
    function handle() {      jsonp('http://localhost:3000', 'callback').then(res => {        console.log(res)      })    } </script>
前端通過一個(gè)jsonp函數(shù),傳入請(qǐng)求的url和回調(diào)函數(shù)的名稱cb,然后在jsonp函數(shù)里面創(chuàng)建一個(gè)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)建一個(gè)http服務(wù)器,解析前端傳過來的callback字符串參數(shù),將數(shù)據(jù)作為參數(shù)返回"callback('hello world')"格式的一個(gè)函數(shù)。

缺點(diǎn):

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

2. CORS(跨資源共享)

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

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è)置允許的請(qǐng)求方式和請(qǐng)求頭等。

3.nginx反向代理

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

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

4. node 中間件代理

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

5. websocket

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

// 前端<script>    function WebSocketTest(url, params = {}) {      return new Promise((resolve, reject) => {
        // 創(chuàng)建socket實(shí)例對(duì)象        const socket = new WebSocket(url)
        // 當(dāng)連接打開時(shí)發(fā)送數(shù)據(jù)        socket.onopen = () => {          socket.send(JSON.stringify(params))        }
        // 接收到后端的消息時(shí)打印數(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 伺服器 (隨時(shí)都在線的服務(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)父級(jí)頁面和iframe頁面不在同一個(gè)域名下,他們之間的數(shù)據(jù)傳輸也存在跨域問題,父級(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) {  // 接收父級(jí)頁面?zhèn)鬟^來的數(shù)據(jù)      // console.log(e.data);      title.innerText = e.data.age;      e.source.postMessage("阿杰 20了", e.origin)  // 向父級(jí)頁面發(fā)送消息    }  </script>

7.document.domain

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

總結(jié)

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

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

跨域方案

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

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


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

主站蜘蛛池模板: 国产精品日韩在线观看 | 成人无码影片精品久久久 | 国产成人精品免高潮在线观看 | 超薄丝袜足j好爽在线观看 超超碰免费超超碰免费 | 国产福利午夜波多野结衣 | 高清日韩午夜无码看片 | 爆乳护士hd完整版在线播放 | 9191精品国产免费不久久 | av无码中文字幕不卡一二三区 | 精品久久久久久久无码中文 | 成人无码激情视频在线观看 | 国产精品嫩草影院入口一二三 | 国产日韩欧美另类重口在线 | 国产白浆精品 | 国产欧美日韩制服在线精选推荐 | 国产午夜理论片不卡 | 国产av无码乱码国产精品 | 成年无码av片大全在线播放 | 国产精欧美一区二区三区 | 国产精品麻豆 | 国产美女露脸口爆吞精 | 国产成人经典视频在线 | 国语自产偷拍精品视频偷 | 国产精品亚洲一区二区久久 | 国产人妖ts视频在线观看 | 国产喷水1区2区3区咪咪爱av | 国产黄色在线播放 | 精品亚洲一区国产精品 | 国产精品户外野外亚洲av又 | 911日本亚洲精品 | 国产精品人妻一区二区三区a | 国产无码免费看黄 | 国产亚洲精品久久久一区 | 国产视频一区二区三区 | 国产精品日韩欧美在线第3页 | 不卡国产丝袜在线观看 | 成人国产三级视频在线观看 | 国产精品一线二线三线精华液 | 精品国产亚洲老地址 | 国产美女精品自在线拍免费 | 国产av一区二区精品久久 |