Web前端开发,必须要了解的跨域解决方案
文章目录
- Web中的四种跨域的解决方案
- 1、JSONP
- 2、CORS通信
- 3、node代理(以vue为例)
- 4、服务器网关,指定链接规则,重写链接。(其实6、7都是在服务端解决跨域)
- 5、后端做转发。
- 6、postMessage
- 7、document.domain
Web中的四种跨域的解决方案
1、JSONP
原生写法
<script src="http://domain/api?param1=6&callback=jsonp"></script>
<script> function jsonp(data) {console.log(data)}
</script>
封装后写法
<script>//参数obj说明://eg:{// url:'',// params:{},// success:function(){}// }function jsonpPakeage(obj) {//创建 写入url地址中的函数名称,var callbackName = "fn"+Math.random().toString(16).split("\.")[1]; //创建一个script标签var script = document.createElement("script");let params = obj.params || '';if (typeof params == 'object') {var arr = new Array();for (var key in params) {arr.push(key + '=' +params[key])}params = arr.join('&');}//设置标签的请求路径 像这样:http://localhost:3000/api?callback=fn153498520409635392&id=1script.src = obj.url + '?' + 'callback=' + callbackName + '&' + params;//将创建好的带请求的script标签添加到html的body中document.getElementsByTagName('head')[0].appendChild(script);//定义回调函数//这里必须这样写window[callbackName]; 如果写window.callbackName会报错没有定义window[callbackName] = function (res) {obj.success(res);delete window.callbackName; //由于请求一次会创建一个script标签和一个函数,所以每次获取到结果后就删除document.getElementsByTagName('head')[0].removeChild(script);}}//调用jsonpPakeage({url:"http://localhost:8080/js/index.js",parames:"",success:function(res){console.log(res)}})</script>
JSONP跨域的原理
利用 <script> 标签中的src属性,不受浏览器同源策略影响的特性。通过 <script> 标签中的src属性指向一个需要访问的地址,并且我们可以通过传递一个callback函数来接收并处理返回信息
JSONP跨域的缺陷
只限于 get 请求
2、CORS通信
CORS通信的关键是后端。
在服务器端,需要设置指定允许访问的IP( Access-Control-Allow-Origin),就可以开启 CORS
3、node代理(以vue为例)
vue项目,一般在项目config目录下面有个index.js 文件
配制proxyTable做代理
// config/index.js'use strict'
const path = require('path')
module.exports = {dev: {proxyTable: {'/api': {target: 'http://localhost:7001',//后端接口地址changeOrigin: true, // 是否允许跨越pathRewrite: {'^/api': '/api', // 重写,}}},其它配制略过。。。。。。},}
4、服务器网关,指定链接规则,重写链接。(其实6、7都是在服务端解决跨域)
5、后端做转发。
6、postMessage
这种方式通常用于获取嵌入页面中的第三方页面数据。一个页面发送消息,另一个页面判断来源并接收消息
通过postMessage方法发送数据。
otherWindow.postMessage(message, targetOrigin, [transfer]);
通过监听message事件来接收传递过来的数据。
window.addEventListener("message", function(event) { console.log(event, event.data);
}, false);
案例如下:
父窗体创建跨域iframe并发送信息
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>跨域POST消息发送</title></head><body><textarea id="message"></textarea><input type="button" value="发送" onclick="sendPost()"><iframe src="http://moweide.gitcafe.io/other-domain.html" id="otherPage" style="display:none"></iframe></body><script type="text/JavaScript"> // sendPost 通过postMessage实现跨域通信将表单信息发送到 moweide.gitcafe.io上, 并取得返回的数据function sendPost() { // 获取id为otherPage的iframe窗口对象var iframeWin = document.getElementById("otherPage").contentWindow; // 向该窗口发送消息iframeWin.postMessage(document.getElementById("message").value,http://moweide.gitcafe.io'); } // 监听跨域请求的返回window.addEventListener("message", function(event) { console.log(event, event.data); }, false);</script></html>
子窗体接收信息并处理
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>POST Handler</title><script src="//code.jquery.com/jquery-1.11.0.min.js"></script><script type="text/JavaScript">// 监听父窗口发送过来的数据向服务器发送post请求window.addEventListener("message", function( event ) {var data = event.data; //接收父窗口传递过来的数据window.parent.postMessage(res, "*"); //通过postMessage给父窗口发送新的信息}, false);</script></head><body></body>
</html>
7、document.domain
利用document.domain 实现跨域的前提条件:
这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域
也就是说,这种方法,只适用于同一个域名下的不同的二级域名之间,使用document.domain = ‘主域名’ 来实现跨域)
作者:木子水吉_08
链接:https://www.jianshu.com/p/3d8748f85a06
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考链接
https://baijiahao.baidu.com/s?id=1628698007235057817&wfr=spider&for=pc
Web前端开发,必须要了解的跨域解决方案相关推荐
- firefox如何载入json文件_如何去解决JS跨域问题 怎么能学好Web前端开发
如何去解决JS跨域问题?怎么能学好Web前端开发?JavaScript跨域是指通过JS在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过JS获取页面中不同域的框架中(if ...
- eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?
众所周知,Web前端是现在很火的行业,找工作的人也多,招聘的公司也多,工作环境也好,各招聘公司给的工资也高,这么火热的行业还是供不应求. Web前端市场的供不应求直接导致前端工程师的待遇提高,另外一方 ...
- 零基础开始学 Web 前端开发,有什么建议吗?--知
张立民 ,北京网站建设http://www.ookcn.com https://www.zhihu.com/question/19637373 https://www.zhihu.com/questi ...
- 超级棒的170+款web前端开发工具汇总,千万要收藏好!
作者:web前端开发 我们与企业内部的Web开发团队进行了很多次交流,研究了很长时间,最后将Debug工具与Web前端开发工具整理汇总在了一起,这些工具对每个Web开发人员都非常有用. 这些工具将使您 ...
- web前端开发最佳实践--(笔记之JavaScript最佳实践)
如何避免全局变量污染? 避免定义全局变量或全局函数 用一个变量进行封装,并返回外部需要访问的接口 如何写出高维护的js代码 配置数据和代码逻辑分离 如: 改成: --- 用js模板 mustache ...
- Web前端开发面试考点指南
Web 前端面试指南与高频考题解析指南 第一章 面试准备:简历编写和面试前准备 一般来说,跳槽找工作要经历投递简历.准备面试.面试和谈 offer 四个阶段.其中面试题目会因你的等级和职位而异,从入门 ...
- 《Web前端开发最佳实践》学习笔记
一.Web前端开发概述 Web前端:前端UI+后端数据交互 具体技能:页面标记 + 页面样式 + 前端编程 + 跨平台.跨浏览器 + 前端框架 + 调试工具 二.高效Web前端开发 文件结构: js: ...
- 学web前端开发写给新手的建议,超实用
随着互联网的发展,Web前端开发成为目前最火热的岗位.Web前端开发的技术知识也是在不断更新,致使Web前端开发工作变得越来要复杂:以前,只要会编写HTML, CSS 和Java就能够找到一份不错的前 ...
- WEB前端开发职业学习路线初级完整版
下面小编专门为广大web前端开发职业者汇总了学习路线初级完整版,其实web前端开发工程师可算是高福利,高薪水的职业了,所以现在学习web前端开发的技术人员也是越来越多了,但是在学习web前端开发中去学 ...
- web前端开发技术现状与发展_Web前端开发的未来,将会有哪些发展方向?
Web前端开发,这已经发展多年的技术从最早的萌芽状态,发展到了今天的枝繁叶茂,各种技术的层出不穷也让开发者们不断地成长壮大.从最早的简单学习就能轻松应付,到今天的需要系统学习才能入职.那么,未来这项技 ...
最新文章
- 【队列源码研究】消息队列beanstalkd源码详解
- UEFI+GPT安装Windows8和CentOS双系统
- AnkhSVN 1.0.2778 简体中文版发布
- 有关 Conversion to Dalvik format failed with error 1
- 孙甘露:小说是他的女人,写作是他爱女人的过程
- Exception和RuntimeException的区别
- 五分钟读懂UML类图
- 学习C++项目—— 计算机网络编程基础 和 学习多线程,多进程基础
- 华为mate20云备份恢复卡住了_注意了!包括华为、荣耀在内的14款老机型开启EMUI11公测了...
- html怎么把桌面的图片放大缩小,css怎么让图片随屏幕大小改变?
- 数学文化——数论之美
- 日立电梯举办2018“新思维 新动能”创新分享汇
- 两年数据对比柱形图_对比数据还在用千篇一律的柱形图?试试wifi对比图,让人过目不忘...
- 大数据时代的智能运维
- 【论文总结】Prototype Rectification for Few-Shot Learning(附翻译)
- 神犇营-my1002-朋友圈集赞
- 抓取得物数据出现验证码的解析思路
- 六种车牌检测识别算法GitHub项目调研对比
- valueOf() 方法
- 斯坦福大学Dan Jurafsky主讲NLP笔记 2.1 Regular Expressions