公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

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

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

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

跨域是指從一個域名的網(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)行跨域訪問。可以是具體的域名,也可以是*表示允許所有源。如下

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

主站蜘蛛池模板: 韩国午夜aaa三级三级 | 国产成人精品999在线观看 | 国产黄色网站在线免费观看 | 99久久精品人妻 | 91福利精品老师国产自产在线 | 国产熟睡乱子伦午夜视频 | 国产在线观看av福利 | 国产在线精品亚洲第一区香蕉 | 国内精品无码一区二区三区 | 国产精品入口麻豆完整版 | 国产激情久久久久影院蜜桃av | 18禁裸乳无遮挡高清免费观看 | 国产91精品一区二区麻豆观看 | 国产精品自产在线观看免费 | 国产av无码片毛片一级 | 国产成人精品亚洲午夜麻豆 | 粉嫩av久久一区二区三区王玥 | 白浆一区二区在线观看 | a级毛片在线观看 | 91精品无码一区二区三区色噜噜 | 国产v综合v亚洲欧美大另类 | 国产一区二区三区在线观看精品 | 国产av剧情md精品麻豆 | 国产精品欧美综合在线 | 国产av一区二区三区幸福宝 | 91中文字幕在线永久观看 | 国产无码不卡黑人在线观看 | 国产一区二区三区亚洲欧美 | 国产成人综合亚洲av网站 | 国产精品一区二区在线观看99 | 精品亚洲国产成人蜜臀av | 成人国内精品视频在线观看 | 国产精品无码久久久最线观看 | 国产桃色无码在线播放一区 | 99国产精品电影 | 国产精品美女久久久久久久久 | 高清视频在线观看一 | 寡妇高潮一级毛片免费看懂色 | 国产91精品在线观看 | 成人午夜免费视频免费看 | 成人精品一区二区三区电影黑人 |