2.三种前端跨域的解决方法
1.什么是跨域?
跨域不是問題,是一種安全機制。
廣域的跨域:指一個域下的文檔或腳本試圖去請求另一個域下的資源。
?資源跳轉: A鏈接、重定向、表單提交資源嵌入: <link>、<script>、<img>、<frame>等dom標簽,還有樣式中background:url()、@font-face()等文件外鏈腳本請求: js發起的ajax請求、dom和js對象的跨域操作等狹義的跨域:由瀏覽器同源策略限制的一類請求場景。
同源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。
同源策略限制以下幾種行為:
Cookie、LocalStorage 和 IndexDB 無法讀取DOM 和 Js對象無法獲得AJAX 請求不能發送常見域名場景
URL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明 ? ? ? ? ? ? ? ? ? ?是否允許通信http://www.example.com/a.jshttp://www.example.com/b.js ? ? ? ? 同一域名,不同文件或路徑 ? ? ? ? ? 允許http://www.example.com/lab/c.js?http://www.example.com:8080/a.jshttp://www.example.com/b.js ? ? ? ? 同一域名,不同端口 ? ? ? ? ? ? ? 不允許http://www.example.com/a.jshttps://www.example.com/b.js ? ? ? 同一域名,不同協議 ? ? ? ? ? ? ? 不允許http://www.example.com/a.jshttp://192.168.1.1/b.js ? ? ? ? ? 域名和域名對應相同ip ? ? ? ? ? ? 不允許http://www.example.com/a.jshttp://x.example.com/b.js ? ? ? ? ? 主域相同,子域不同 ? ? ? ? ? ? ? 不允許http://example.com/c.jshttp://www.example1.com/a.jshttp://www.example2.com/b.js ? ? ? 不同域名 ? ? ? ? ? ? ? ? ? ? ? ? 不允許2.跨域導致的問題
跨域并不會阻止請求的發出,也不會阻止請求的接受,跨域是瀏覽器為了保護當前頁面,你的請求得到了響應,瀏覽器不會把響應的數據交給頁面上的回調,取而代之的是去提示你這是一個跨域數據。提示就是一個報錯提示。
?報錯提示:從某某位置請求的資源被阻擋了,因為沒有在響應頭里發現:"Access-Control-Allow-Origin"的響應頭。
3.三種前端跨域方法
i.跨域資源共享(CORS)(服務端設置,前端直接調用,后臺允許前端某個站點進行訪問)
普通跨域請求:只服務端設置Access-Control-Allow-Origin即可,前端無需設置;若要帶cookie請求:前后端都需要設置。
通過Access-Control-Allow-Origin響應頭,就告訴了瀏覽器。如果請求我的資源的頁面是我這個響應頭里記錄了的"源",則不要攔截此響應,允許數據通行。
目前,所有瀏覽器都支持該功能(IE8+:IE8/9需要使用XDomainRequest對象來支持CORS)),CORS也已經成為主流的跨域解決方案。
?安裝axios插件npm i axios --save-dev?引用axios插件import axios from "axios"?響應代碼let url="跨域接口url"axios.get(url).then(()=>{})}ii.JSONP跨域(前端適配,后端配合,前后臺同時改造)
為了減輕服務器的負載,我們把js、css,img等靜態資源分離到另一臺獨立域名的服務器上,在html頁面中再通過相應的標簽從不同域名下加載靜態資源,而被瀏覽器允許,基于此原理,我們可以通過動態創建script,再請求一個帶參網址實現跨域通信。
安裝jsonp插件npm i jsonp --save-dev?引用jsonp插件import jsonp from "jsonp"?響應代碼let url="跨域接口url"jsonp(url),(err,res)=>{let result=res;this.data=result;}通過JSONP則不需要Access-Control-Allow-Origin字段;因為JSONP訪問不是一個請求,而是JS腳本。
JSONP缺點:只能實現get一種請求。
iii.代理跨域(訪問a接口,代理到b接口;通過修改nginx服務器配置來實現前端修改,后臺不動)
類型:1.nginx代理跨域;2.Nodejs中間件代理跨域
創建vue.config.js(webpack的配置表)?//遵循node.js規范,使用module.exports={}module.exports = {devServer: {host: "localhost",//主機port: 8080,//端口//代理proxy: {//訪問a接口,代理到b接口,真正訪問b接口"/api": { //a接口target: "http://mall-pre.springboot.cn",//b接口changeOrigin: true, // changeOrigin為是否需要將主機原點改為目標url地址//設置空的虛擬接口,統一接口,方便攔截pathRewrite: { //轉發地址api: "",},},},},};更改vue.config.vue的配置信息時,需要重啟項目(npm run serve)
總結
以上是生活随笔為你收集整理的2.三种前端跨域的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Autodesk 360 Mobile不
- 下一篇: 谷歌浏览器32位安装包_Chromium