文章目录

  • 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通信的关键是后端。
服务器端,需要设置指定允许访问的IPAccess-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前端开发,必须要了解的跨域解决方案相关推荐

  1. firefox如何载入json文件_如何去解决JS跨域问题 怎么能学好Web前端开发

    如何去解决JS跨域问题?怎么能学好Web前端开发?JavaScript跨域是指通过JS在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过JS获取页面中不同域的框架中(if ...

  2. eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?

    众所周知,Web前端是现在很火的行业,找工作的人也多,招聘的公司也多,工作环境也好,各招聘公司给的工资也高,这么火热的行业还是供不应求. Web前端市场的供不应求直接导致前端工程师的待遇提高,另外一方 ...

  3. 零基础开始学 Web 前端开发,有什么建议吗?--知

    张立民 ,北京网站建设http://www.ookcn.com https://www.zhihu.com/question/19637373 https://www.zhihu.com/questi ...

  4. 超级棒的170+款web前端开发工具汇总,千万要收藏好!

    作者:web前端开发 我们与企业内部的Web开发团队进行了很多次交流,研究了很长时间,最后将Debug工具与Web前端开发工具整理汇总在了一起,这些工具对每个Web开发人员都非常有用. 这些工具将使您 ...

  5. web前端开发最佳实践--(笔记之JavaScript最佳实践)

    如何避免全局变量污染? 避免定义全局变量或全局函数 用一个变量进行封装,并返回外部需要访问的接口 如何写出高维护的js代码 配置数据和代码逻辑分离 如: 改成: --- 用js模板 mustache ...

  6. Web前端开发面试考点指南

    Web 前端面试指南与高频考题解析指南 第一章 面试准备:简历编写和面试前准备 一般来说,跳槽找工作要经历投递简历.准备面试.面试和谈 offer 四个阶段.其中面试题目会因你的等级和职位而异,从入门 ...

  7. 《Web前端开发最佳实践》学习笔记

    一.Web前端开发概述 Web前端:前端UI+后端数据交互 具体技能:页面标记 + 页面样式 + 前端编程 + 跨平台.跨浏览器 + 前端框架 + 调试工具 二.高效Web前端开发 文件结构: js: ...

  8. 学web前端开发写给新手的建议,超实用

    随着互联网的发展,Web前端开发成为目前最火热的岗位.Web前端开发的技术知识也是在不断更新,致使Web前端开发工作变得越来要复杂:以前,只要会编写HTML, CSS 和Java就能够找到一份不错的前 ...

  9. WEB前端开发职业学习路线初级完整版

    下面小编专门为广大web前端开发职业者汇总了学习路线初级完整版,其实web前端开发工程师可算是高福利,高薪水的职业了,所以现在学习web前端开发的技术人员也是越来越多了,但是在学习web前端开发中去学 ...

  10. web前端开发技术现状与发展_Web前端开发的未来,将会有哪些发展方向?

    Web前端开发,这已经发展多年的技术从最早的萌芽状态,发展到了今天的枝繁叶茂,各种技术的层出不穷也让开发者们不断地成长壮大.从最早的简单学习就能轻松应付,到今天的需要系统学习才能入职.那么,未来这项技 ...

最新文章

  1. 【队列源码研究】消息队列beanstalkd源码详解
  2. UEFI+GPT安装Windows8和CentOS双系统
  3. AnkhSVN 1.0.2778 简体中文版发布
  4. 有关 Conversion to Dalvik format failed with error 1
  5. 孙甘露:小说是他的女人,写作是他爱女人的过程
  6. Exception和RuntimeException的区别
  7. 五分钟读懂UML类图
  8. 学习C++项目—— 计算机网络编程基础 和 学习多线程,多进程基础
  9. 华为mate20云备份恢复卡住了_注意了!包括华为、荣耀在内的14款老机型开启EMUI11公测了...
  10. html怎么把桌面的图片放大缩小,css怎么让图片随屏幕大小改变?
  11. 数学文化——数论之美
  12. 日立电梯举办2018“新思维 新动能”创新分享汇
  13. 两年数据对比柱形图_对比数据还在用千篇一律的柱形图?试试wifi对比图,让人过目不忘...
  14. 大数据时代的智能运维
  15. 【论文总结】Prototype Rectification for Few-Shot Learning(附翻译)
  16. 神犇营-my1002-朋友圈集赞
  17. 抓取得物数据出现验证码的解析思路
  18. 六种车牌检测识别算法GitHub项目调研对比
  19. valueOf() 方法
  20. 斯坦福大学Dan Jurafsky主讲NLP笔记 2.1 Regular Expressions

热门文章

  1. php常用的系统函数
  2. MongoDB查找附近的人
  3. python configparser 数组_python读取ini配置文件,python中数组如何表示
  4. 【2020年总结】- 时光记录片
  5. git 忽略文件权限修改
  6. LeNet模型及代码详解
  7. 深入理解JVM-内存模型
  8. 【小程序源码】炫酷制作神器,支持,姓氏头像等强大的制作小程序源码
  9. 在ros下对py文件进行编译执行及遇到的一些问题
  10. 无法安装Hyper-V:虚拟机监控程序已在运行中