⑴ vue的跨域方式
如果搜素vue的跨域,大概率找到的是介紹配置的方法,然後介紹啥是跨域,blablablla。看了半天呢,還是很茫然。到底怎麼跨域?
可能對於圈子裡面人來說,跨域沒啥好說的,告訴你配置方式不就完事了嗎?還需要啥自行車?
但是對於新手,或者從其他地方轉過來的就會比較懵逼。。。
以前一般用ajax 的 jsonp 來跨域,這個簡單,前端基本不用改啥,後端配合一下就好,簡單易懂。
後來出現了 CROS,這個麻煩一點,前端要各種配置,後端也要各種配合。
雖然一開始弄的時候容易報錯,但是折騰折騰也就可以調通了。
但是到了 vue 卻比較茫然,因為默認的跨域方式改成了代理的方式。
代理是啥呢?簡單的說,瀏覽器直接訪問其他網站,這是跨域,不行滴,那麼怎麼辦呢?可以找個代理呀。
瀏覽器先訪問自己的服務端(假設叫做A),然後再讓A去訪問後端API,這樣就不是跨域了。A就實現了代理功能。
我們用腳手架建好項目,然後運行的時候,默認就帶上了這個代理的功能,所以我們配置好就可以實現跨域了,後端API也不用做配合,(只要不封IP地址就好)。
vite也支持代理的功能,所以也是一樣,做好配置就可以用了。
上線後可以用nginx,也是支持代理的。
只是有點小問題,多佔用一個伺服器。
以vite2建立的項目為例,介紹一下:
這樣就好了。
然後可以用axios來訪問。
然後可以得到數據:
data屬性是後端API返回的數據,
status 是後端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 ,這樣即實現代理跨域;
⑶ vue跨域解決方法
vue跨域解決方法
使用axios請求
第一步驟
在vue.config.js 文件中 mole.exports = { } 中添加
devServer: {
proxy: {
'/profile': { //指定 路徑 要 跨域請求地址
// 在本地會創建一個虛擬服務端,然後發送請求的數據,並同時接收請求的數據,這樣服務端和服務端進行數據的交互就不會有跨域問題
// 將/api開頭的url轉發到target上。
target: ' https://sso.www.eee.cn/profile',// 跨域請求地址
changeOrigin: true, //虛擬的站點需要更管origin
ws: true, // 代理websockets
secure: true, // 如果是https介面,需要配置這個參數
pathRewrite: {
// 顧名思義,將/api重寫為 / 此時url變為 http://192.168.101.110:8888/ 而不是 http://192.168.101.110:8888/api
'^/profile': ''
}
}
}
第二步驟
在封裝axios請求中設置
const service = axios.create({
baseURL: '/profile',//定義要跨域的介面路徑
withCredentials: true,//是否支持跨域
timeout: 500000, // request timeout
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/x-www-form-urlencoded'
}
});
⑷ vue 設置proxyTable解決跨域問題
最近接收一個前後端分離的項目,本地環境啟動之後總是報跨域問題:
經過一番費勁心思的排查,發現是瀏覽器的同源策略不允許跨域訪問,所謂同源策略是指協議、域名、埠相同,proxyTable通過代理可以解決這個問題。
在config目錄下的index.js設置
上方配置的目的就是將前端請求localhost:3000/api/xxx 代理為localhost:8081/api/xxx
⑸ 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項目中配置proxy解決跨域問題
1.問題:
後端給的介面是:https://stg-pteppp.leanapp.cn/h5/jsconfig.前端在本地開發中調用該介面跨域。
2.解決方案:
* 在webpack中配置proxy。如下圖所示
如上:
1. target是你要代理的域名,必須要加上http。
2. 這里用'/api'代替target裡面的地址,組件中調用介面時直接用'/api'代替。比如我要調用'https://xxx.com/news.直接寫'/api/news'即可
3. changeOrigin必須為true
* 在頁面中請求寫法如下:
開心吧。數據終於拿到啦!!!
我們知道,vue2.0項目中的static文件夾存儲的是靜態資源,可以直接被訪問到的,如果我們將mock的數據放入static文件夾,在瀏覽器中直接訪問http://localhost:8080/static/json/list.json發現是可以訪問到數據的。於是我們在頁面將mock數據的請求寫成下面這樣:
則需要在webpack中做如下配置:
注意這里的http一定不能省略,否則數據請求不到。這樣做的好處是在本地開發時mock的介面和線上的介面一致,避免上線前大量改動介面名稱。
⑺ 解決Vue http中的跨域問題
在平常的項目開發當中,很容易遇到跨域的問題,好在vue-cli的腳手架提供了跨域的解決方案,在config下的index.js中有個proxyTable屬性,在其中添加如下配置:
proxyTable: {
'/api':{
target:'http://localhost:8090',
changeOrigin:true,
pathRewrite:{
}
}
如上所示,如果在8090後在加路徑,則無效(親測);
在pathRewite中可以添加替換,因為在正常代理過後會在路徑結尾有ap這個路徑,所以如果實際的地址和這個不同,則可以進行替換。
⑻ 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方法。