當前位置:首頁 » 網頁前端 » vue前端讀取遠程html跨域
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

vue前端讀取遠程html跨域

發布時間: 2023-03-14 09:49:24

『壹』 vue.js使用http-proxy-middleware解決跨域請求問題

最近在使用vue-cli搭建項目的過程中,遇到了跨域請求數據的問題,這里貼出我的解決方法,希望對大家有所幫助。

什麼是跨域請求:

如果在A網站中,我們希望使用Ajax來獲得B網站中的特定內容,如果A網站與B網站不在同一個域中,那麼就出現了跨域訪問問題。由於瀏覽器同源策略,凡是發送請求url的協議、域名、埠三者之間任意一與當前頁面地址不同即為跨域。

這里,數據請求用的是vue-resource(目前vue官方是推薦使用axios),安裝插件:

npm install--save-devvue-resource

1

在main.js中引入插件:

importVueResourcefrom'vue-resource'

Vue.use(VueResource)

這里,解決跨域使用的是http-proxy-middleware來進行介面代理,安裝方法同上:

npm install--save-devhttp-proxy-middleware

下面開始談正事,舉個栗子:

本地項目地址是:localhost:8080,現在我們要訪問  http://m.maizuo.com/v4/api/film/comming-soon  和  http://m.maizuo.com/v4/api/billboard/home  這兩個線上地址:

首先,設置build/dev-server.js:

varproxyMiddleware =require('http-proxy-middleware')

varserver = express()

server.middleware = [        proxyMiddleware(['/film/coming-soon'], {target:'http://m.maizuo.com/v4/api', changeOrigin:true}),        proxyMiddleware(['/billboard/home'], {target:'http://m.maizuo.com/v4/api', changeOrigin:true})];

server.use(server.middleware);

注意,當要訪問多個線上地址時,公共的地址部分寫在target屬性值裡面,比如這里的  http://m.maizuo.com/v4/api  ,然後[ ]里邊寫地址的不同部分。

然後,修改config/index.js :

dev:{env:require('./dev.env'),    port:8080,    proxyTable: {'/api': {        target:'http://m.maizuo.com/v4/api',        changeOrigin: true,        pathRewrite: {'^/api':''}      }    }  }

這里的target同上面的一樣,然後』/api』和』^/api』代表的就是這個根目錄地址;

然後,在頁面中具體的調用為:

this.$http.get('api/billboard/home').then((response) => {

});

這里,url的值為api + [ ] 中的部分 ;

然後,我們就解決了vue中的跨域問題 ;

這里,貼一下http-proxy-middleware插件的github地址,看更多用法 :

https://github.com/chimurai/http-proxy-mid

『貳』 如何解決前端跨域問題

可以使用伺服器代理或者在後端設置允許跨域。
現在的項目一般是在後端設置允許跨域,前端在帶有允許跨域的情況下,可以像沒有跨域一樣正常訪問。
如果前端單獨發布到伺服器,也可以在伺服器是設置代理,使用代理轉發請求。

『叄』 vue 如何實現跨域

跨域問題是因為瀏覽器的同源策略引起的,一種瀏覽器的安全機制,要求 協議,域名,埠 ,都要一致!

出於瀏覽器的同源策略限制,瀏覽器會拒絕跨域請求。

什麼叫跨域?非同源請求,均為跨域。名詞解釋:同源 —— 如果兩個頁面擁有相同的協議(protocol),埠(port)和主機(host),那麼這兩個頁面就屬於同一個源(origin)。

怎麼解決跨域?最常用的三種方式: JSONP、CORS、postMessage

jsonp,只支持get,不支持post,需要調用前端和被調用後端配合(比較常用)

後端HttpClient進行轉發,兩次請求,效率低,安全(類似Nginx反向代理)

服務端設置響應頭,允許跨域,適於小公司快速解決問題

Nginx搭建API介面網關

Zuul搭建API介面網關

後四種都屬於服務端設置,對於目前還是一個純前端的我來說,先把前端的搞懂再說,所以在此只說前端

jsonp工作原理理解

jsonp實際上是通過動態插入js的方式實現的跨域,因為通過script標簽引入js文件沒有跨域一說

web客戶端通過調用腳本的方式去調用跨域服務端動態生成的js文件(一般以json為後綴),同時傳遞一個callback參數給服務端,服務端以這個參數名為函數名,調用此函數以參數的形式將數據傳到web端,這樣就實現了前端跨域請求服務端數據。

【JSONP的優缺點】

優點:兼容性好(兼容低版本IE)

缺點:1.JSONP只支持GET請求; 2.XMLHttpRequest相對於JSONP有著更好的錯誤處理機制

CORS :是W3C 推薦的一種新的官方方案,能使伺服器支持 XMLHttpRequest 的跨域請求。CORS 實現起來非常方便,只需要增加一些 HTTP 頭,讓伺服器能聲明允許的訪問來源。

postMessage : window.postMessage(message,targetOrigin) 方法是html5新引進的特性,可以使用它來向其它的window對象發送消息,無論這個window對象是屬於同源或不同源,目前IE8+、FireFox、Chrome、Opera等瀏覽器都已經支持 window.postMessage方法。

『肆』 vue 設置proxyTable解決跨域問題

最近接收一個前後端分離的項目,本地環境啟動之後總是報跨域問題:

經過一番費勁心思的排查,發現是瀏覽器的同源策略不允許跨域訪問,所謂同源策略是指協議、域名、埠相同,proxyTable通過代理可以解決這個問題。
在config目錄下的index.js設置

上方配置的目的就是將前端請求localhost:3000/api/xxx 代理為localhost:8081/api/xxx

『伍』 解決Vue http中的跨域問題

在平常的項目開發當中,很容易遇到跨域的問題,好在vue-cli的腳手架提供了跨域的解決方案,在config下的index.js中有個proxyTable屬性,在其中添加如下配置:

proxyTable: {

'/api':{

target:'http://localhost:8090',

changeOrigin:true,

pathRewrite:{

}

}

如上所示,如果在8090後在加路徑,則無效(親測);

在pathRewite中可以添加替換,因為在正常代理過後會在路徑結尾有ap這個路徑,所以如果實際的地址和這個不同,則可以進行替換。

『陸』 vue 前端設置跨域多代理

在項目開發的時候經常會遇到後端提供的多個服務請求地址域名或埠號不一致的情況這時候就需要前端設置多個proxy跨域代理,本文以vue-element-admin為例展示步驟如下:
1: 配置環境變數 .env.development

2: 配置項目根目錄下的vue.config.js 找到devServer

PS:注意VUE_APP_BASE_API 放在數組的最後一個,如果你VUE_APP_BASE_API跟我一樣設置為'' 的話,這樣才不會被代理的虛擬path覆蓋!

3: 找到項目中管理請求地址的文件 src/api/proxy.js (proxy.js 是我隨便起的名字😄)

打開proxy.js

proxy_api 就是你之前在步驟1:中定義的虛擬path
VUE_APP_BASE_API_PROXY = '/proxy-api'
const url = (path) => (proxy_api + path) 一個路徑處理函數,參數是'/xx/xxx/fetch/list',return (proxy_api + path)

需要額外注意的是我在配置環境變數 .env.development的時候基礎api設置的是空:

所以不需要在src/utils/request.js 中對代理的請求進行攔截

如果你為VUE_APP_BASE_API設置了虛擬path路徑,那麼就需要在src/utils/request.js為這個虛擬路徑配置攔截,比較麻煩比不建議這么做。

至此跨域多代理已經設置完了,本文中設置兩個代理一個基礎代理VUE_APP_BASE_API,一個額外代理VUE_APP_BASE_API_PROXY,默認情況下走基礎代理,當請求匹配到匹'/proxy-api' 時走額外代理~

『柒』 Vue項目中跨域問題的解決

在Web端Vue項目開發過程中,跨域問題是不可避免的;在我參與的Vue項目中,使用伺服器代理的解決方案;針對不同的環境(開發環境/生產環境),採用了不同的伺服器代理方案;

伺服器代理的原理大概是這樣:
代理伺服器和訪問源(請求端)是同源的,但和被訪問伺服器(資源端)是不同源的,但伺服器之間的訪問不受瀏覽器同源策略的影響(即不必擔心是否有跨域問題),那麼我們即可請求到同源伺服器上的從被訪問伺服器上的獲取到的請求資源了

這樣配置完成後,我們發起的每次http請求的Request Url的前面一部分都會和我們本地的源一樣;
舉例:

我們項目跑在開發環境下的 http://localhost:8080 上,那麼上述請求的Request Url的就是 http://localhost:8080/api/bookCate ;這應該就是我們的代理伺服器中該資源的地址,與客戶端同源;而數據的實際來源則是 http://219.216.5.26:8080/api/bookCate ,這樣即實現代理跨域;

目前猜測這個代理伺服器可能是Node;

nginx 版本: 1.16.1
修改 nginx.conf 文件下的 serve 下配置:

舉例:

生產環境下的,我們項目跑Nginx伺服器監聽的 http://localhost:8088 上,那麼上述請求的Request Url的就是 http://localhost:8088/api/bookCate ;
這應該就是我們的代理伺服器中該資源的地址,與客戶端同源;
而數據的實際來源則是 http://219.21.5.5:9903/api/bookCate ,這樣即實現代理跨域;