跨域
其实作为前端开发,现在项目中很少用这个的,跨域多数是后台解决的,但是少用不等于100%不用,还是要了解一下,以下案例场景都是本人实际项目中的。
概念理解:
所谓跨域,指http请求资源的url地址里的协议、域名、端口号与本页面的不同(3个有一个不同都称为跨域)。
造成原因:
浏览器同源策略限制导致的,它是浏览器最核心也最基本的安全功能。
解决方法:
1.window.postMessage(亲测它不能传递函数,传对象、字符串可以)
它可用于解决以下方面的问题:
- 页面和其打开的新窗口的数据传递
- 多窗口之间消息传递
- 页面与嵌套的iframe消息传递
业务场景分析:
VUE3.0项目中有一个A页面操作下一步需要跳转到B页面签约操作,操作成功后再自动跳回到A页面,由于已经有别的项目写好的B页面了,不想再重复写一遍,此时想到的是用ifram标签嵌套(很老的框架)把B页面嵌入到本页面中,使用v-if控制ifram标签的显隐,B页面操作成功后返回消息为true。
案例:
A窗口:
<iframe v-if="iframeState" id="iframe" frameborder=0 name="showHere" scrolling="auto" :src="signURL" />
window.addEventListener('message',function(){ state.iframeState = false; window.history.back() },false)
B窗口:
window.parent.postMessage({msg:true},*)
优化功能:
因为始终是在同一个路由下,需要监听用户点击左上角的返回事件,在这里就不详谈了)
if (window.history && window.history.pushState) { history.pushState(null, null, document.URL); window.addEventListener('popstate', iframeStateFalse, false); }
关键代码:
发送方:window.parent.postMessage({msg:true},*)
接收方:window.addEventListener('message',function(e){}备注:
2.fetch-jsonp
十一个第三方插件,缺点是只支持get请求,不支持post请求。
官方文档地址:https://github.com/camsong/fetch-jsonp;
下载:npm install fetch-jsonp
引入:import fetchJsonp from"fetch-jsonp"
调用:
3.webpack的devServer配置proxy
只是本地调试使用,打包后就不读devServer,个人理解这个还不如通过vue的.env环境配置来更改axios的baseURL更直接。
以上只是我常用到过的,还有其他别的方法(document.domain,cors,websocket),以后再更新。