欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]跨域的五種最常見解決方案

freeflydom
2023年5月16日 10:54 本文熱度 941

什么是跨域?

跨域不是問題,是一種安全機制。瀏覽器有一種策略名為同源策略,同源策略規定了部分請求不能被瀏覽器所接受。

值得一提的是:同源策略導致的跨域是瀏覽器單方面拒絕響應數據,服務器端是處理完畢并做出了響應的。

什么是同源策略

一個url由三部分組成:協議,域名(ip地址),端口

只有當協議,域名,端口都一致的時候,才被稱為同源。

而同源策略規定,只有發送請求的那一邊和接受請求的那一邊處于同源的情況下,瀏覽器才會接受響應。

舉個例子

發送請求地址:http:47.96.127.5:8080/index    接受請求地址:http:47.96.127.5:8081/index //不同源 端口不同 
發送請求地址:http:47.96.127.5:8080/index     接受請求地址:http:47.96.127.6:8080/index //不同源 ip不同 
發送請求地址:http:47.96.127.5:8080/index     接受請求地址:https:47.96.127.5:8080/index //不同源 協議不同 
發送請求地址:http:47.96.127.5:8080/index     接受請求地址:http:47.96.127.5:8080/login //同源 協議,端口,ip都相同,路徑不同無所謂

而當我們的請求不符合同源策略的時候。往往會出現以下錯誤👇

解決跨域常見的5種方法

第一種:JQuery的ajax(推薦JQuery項目中使用)

jq的ajax自帶解決跨域的方法。底層原理采用的JSONP的跨域解決方案。如下

function callback(){     

console.log("月薪一千五,心比美式苦") }  

$.ajax({     

url: 'http://www.domain2.com:8080/login',     

type: 'get',     

dataType: 'jsonp',  // 請求方式為jsonp  設置跨域的重點     

jsonpCallback: "callBack",  // 回調函數 

});

在JQ項目中,這是最常見的解決方案。

第二種:script標簽解決跨域(遠古Web項目中使用)

如果你的項目是祖傳下來的。沒有框架連JQuery都沒有。沒關系,我們可以嘗試使用原生的方法去解決。

原生采用的是script標簽可以不受跨域限制的特性來實現跨域。

<script>             

// 回調             

function callBack(res) {                 

console.log("跨域的回調",res);                // ...完成你所有操作后記得刪除script↓                

document.head.getElementsByClassName("script")[0].remove();             

}              

const scriptDom = document.createElement('script');             

scriptDom.type = 'text/javascript';             

scriptDom.class = 'script'; //用于刪除             

// 傳參一個回調函數名給后端,方便后端返回時執行這個在前端定義的回調函數             

scriptDom.src = 'http://192.167.0.152:9996/inface?callback=callBack';             

document.head.appendChild(script); //將標簽掛載到dom上         

</script>

這里需要注意的是,使用完請求之后記得刪除script,否則會隨著請求的變多script標簽會一直掛載在DOM上。

在遠古的web中,這是一種方案。但現在已經不用了。

vue/react/jq等框架性項目中不要使用這種方法,不是不行,只是有更好的選擇

第三種:前端代理解決跨域

每一個框架的代理配置都不太一樣。這里僅以我使用的umi.js(react)為例。

Umi.js框架會有 config.ts / config.js 文件,文件中會有proxy字段、字段按圖中配置方法。即可完成跨域

第四種:服務端代理(Nginx代理)

nginx代理一般使用在生產環境。是服務端解決跨域的一種方案。

簡單配置模板👇

#如果監聽到請求接口地址是 www.xxx.com/api/page ,nginx就向http://www.yyy.com:9999/api/page這個地址發送請求 
server {      
listen       80;          
server_name  www.xxx.com;         #判過濾出含有api的請求         
location /api/ {              
proxy_pass http://www.yyy.com:9999; #真實服務器的地址         
} }

注意,nginx配置完代理后需要重啟nginx,nginx代理是生產環境的常用方案

第五種:后臺(邏輯層)添加響應頭解決

Access-Control-Allow-Origin響應頭的意思是,安全同行的請求。

舉個例子 http://192.168.0.103:8080 向http://192.168.0.102:8080 發送了請求,結果因為域名不一樣,在返回信息的時候因為IP地址不一致被攔截。

但是如果http://192.168.0.102:8080 在響應頭中的 Access-Control-Allow-Origin 字段中攜帶上屬性值'http://192.168.0.103:8080' 如下

//響應頭 
Access-Control-Allow-Origin':'http:/ /192.168.0.103:8080'

這就等于告訴瀏覽器,http://192.168.0.102:8080 這個地址是安全的,請不要攔截。

這樣,http://192.168.0.103:8080 就可以接受來自 http://192.168.0.102:8080 返回的信息。

當然,我們也可以進行所有域名均不攔截的設置(如下)

//響應頭 
// * 代表所有域名均不攔截 
Access-Control-Allow-Origin':'*'

node案例如下

res.writeHead(200, {     
Access-Control-Allow-Origin':'http://192.168.0.103:8080' 
});  
//或者  
res.writeHead(200, {     
Access-Control-Allow-Origin':'*' 
});

并不建議此種方案,因為安全性不高。自己寫小練習的時候建議使用,因為真的很方便。

總結

跨域的常見的五種解決方案如下

  1. jsonp,代表:jquery的$.ajax。(僅限JQuery項目使用)

  2. script標簽解決跨域(遠古web使用的方案,已不建議使用)

  3. 前端代理

  4. nginx代理

  5. 設置響應頭(不建議使用,安全性不高,小練習可以用用,方便)



——————————

原文鏈接:https://juejin.cn/post/7194734127390654520


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