位置: 编程技术 - 正文

js实现跨域的4种实用方法原理分析(js跨域请求有哪些方式)

编辑:rootadmin

推荐整理分享js实现跨域的4种实用方法原理分析(js跨域请求有哪些方式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js跨域请求有哪些方式,js实现跨域访问的几种方式,js跨域请求有哪些方式,js跨域的解决方案,js实现跨域的4种方式,js实现跨域的4种表示方法,js实现跨域的4种表示方法,js实现跨域的4种方法,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是js跨域呐?

js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。

要解决跨域的问题,我们可以使用以下几种方法:

一、通过jsonp跨域

在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。

比如,有个a.html页面,它里面的代码需要利用ajax获取一个不同域上的json数据,假设这个json数据地址是 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点需要说明,不同的框架之间(父子或同辈),是能够获取到彼此的window对象的,但蛋疼的是你却不能使用获取到的window对象的属性和方法(html5中的postMessage方法是一个例外,还有些浏览器比如ie6也可以使用top、parent等少数几个属性),总之,你可以当做是只能获取到一个几乎无用的window对象。比如,有一个页面,它的地址是 , 在这个页面里面有一个iframe,它的src是 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:

这个时候,document.domain就可以派上用场了,我们只要把 和 中某个文档的document.domain 可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成 c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。

在页面 中设置document.domain:

在页面 中也设置document.domain,而且这也是必须的,虽然这个文档的domain就是example.com,但是还是必须显示的设置document.domain的值:

这样我们就可以通过js访问到iframe中的各种属性和对象了。

不过如果你想在 页面中通过ajax直接请求 页面,即使你设置了相同的document.domain也还是不行的,所以修改document.domain的方法只适用于不同子域的框架间的交互。如果你想通过ajax的方法去与不同子域的页面交互,除了使用jsonp的方法外,还可以用一个隐藏的iframe来做一个代理。原理就是让这个iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面,所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的,然后就是通过我们刚刚讲得修改document.domain的方法,让我们能通过js完全控制这个iframe,这样我们就可以让iframe去发送ajax请求,然后收到的数据我们也可以获得了。

3、使用window.name来进行跨域

window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。

比如:有一个页面a.html,它里面有这样的代码:

再看看b.html页面的代码:

a.html页面载入后3秒,跳转到了b.html页面,结果为:

我们看到在b.html页面上成功获取到了它的上一个页面a.html给window.name设置的值。如果在之后所有载入的页面都没对window.name进行修改的话,那么所有这些页面获取到的window.name的值都是a.html页面设置的那个值。当然,如果有需要,其中的任何一个页面都可以对window.name的值进行修改。注意,window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,但一般是够用了。

js实现跨域的4种实用方法原理分析(js跨域请求有哪些方式)

上面的例子中,我们用到的页面a.html和b.html是处于同一个域的,但是即使a.html与b.html处于不同的域中,上述结论同样是适用的,这也正是利用window.name进行跨域的原理。

下面就来看一看具体是怎么样通过window.name来跨域获取数据的。还是举例说明。

比如有一个www.example.com/a.html页面,需要通过a.html页面里的js来获取另一个位于不同域上的页面www.gimoo.net/data.html里的数据。

data.html页面里的代码很简单,就是给当前的window.name设置一个a.html页面想要得到的数据值。data.html里的代码:

那么在a.html页面中,我们怎么把data.html页面载入进来呢?显然我们不能直接在a.html页面中通过改变window.location来载入data.html页面,因为我们想要即使a.html页面不跳转也能得到data.html里的数据。答案就是在a.html页面中使用一个隐藏的iframe来充当一个中间人角色,由iframe去获取data.html的数据,然后a.html再去得到iframe获取到的数据。

充当中间人的iframe想要获取到data.html的通过window.name设置的数据,只需要把这个iframe的src设为www.gimoo.net/data.html就行了。然后a.html想要得到iframe所获取到的数据,也就是想要得到iframe的window.name的值,还必须把这个iframe的src设成跟a.html页面同一个域才行,不然根据前面讲的同源策略,a.html是不能访问到iframe里的window.name属性的。这就是整个跨域过程。

看下a.html页面的代码:

上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe。网上也有很多类似的现成代码,有兴趣的可以去找一下。

通过window.name来进行跨域,就是这样子的。

4、使用HTML5中新引进的window.postMessage方法来跨域传送数据

window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 * 。

需要接收消息的window对象,可是通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。

上面所说的向其他window对象发送消息,其实就是指一个页面有几个框架的那种情况,因为每一个框架都有一个window对象。在讨论第二种方法的时候,我们说过,不同域的框架间是可以获取到对方的window对象的,而且也可以使用window.postMessage这个方法。下面看一个简单的示例,有两个页面

我们运行a页面后得到的结果:

我们看到b页面成功的收到了消息。

使用postMessage来跨域传送数据还是比较直观和方便的,但是缺点是IE6、IE7不支持,所以用不用还得根据实际需要来决定。

除了以上几种方法外,还有flash、在服务器上设置代理页面等跨域方式,这里就不做介绍了。

以上四种方法,可以根据项目的实际情况来进行选择应用,希望这篇文章对大家的学习有所帮助。

JavaScript获取function所有参数名的方法 我写了一个JavaScript函数来解析函数的参数名称,代码如下:functiongetArgs(func){//先用正则匹配,取得符合参数模式的字符串.//第一个分组是这个:([^)]*)非右括

自己动手写的javascript前端等待控件 等待控件在网上搜有好多种,但是都很复杂,不一定用的顺手,再说我的项目是bootstrap的原因,又不敢轻易使用第三方控件,怕不兼容,于是自己动手

JS实现带提示的星级评分效果完整实例 本文实例讲述了JS实现带提示的星级评分效果。分享给大家供大家参考,具体如下:这是一款JS仿淘宝网的星级评分系统,鼠标放在上边可以显示星级代

标签: js跨域请求有哪些方式

本文链接地址:https://www.jiuchutong.com/biancheng/382683.html 转载请保留说明!

上一篇:异步JS框架的作用以及实现方法(js异步实现原理)

下一篇:JavaScript获取function所有参数名的方法(JavaScript获取网页内容)

  • 税务零申报是什么意思情况
  • 存货核算的内容是什么
  • 支出算什么会计科目
  • 小规模教育培训计划
  • 可供出售金融资产公允价值变动
  • 费用日记账明细
  • 劳务公司临时工工资需要申报吗
  • 以前年度损益科目核算业务
  • 其它综合收益影响因素
  • 五联发票一般用于哪种单位
  • 生产企业出售空调设备
  • 汇算清缴职工福利支出
  • 知道增值税如何计算开票金额
  • 核定征收企业注销后安全吗
  • 企业购入旧固定资产如何计提折旧
  • 外购材料运输费怎么入账
  • 代开专票地税附加税申报办法
  • 异常增值税扣税凭证
  • 因公出差的人身故怎么办
  • 工商年度报表怎么打印出来
  • 事业单位福利费计提标准
  • 土地溢价的成本包括
  • 怎么免费获取百度文库的付费文档
  • win7 扫描仪
  • 收到美金没有结汇会计分录
  • 查账征收的个独可以随意分配利润吗
  • 个人销售自己使用过的物品免征增值税
  • 在win7中,如何将所有窗口进行层叠排列显示
  • PHP:escapeshellcmd()的用法_命令行函数
  • Vue3 + Vite + TypeScript + dataV 打造可视化大屏
  • PHP:mdecrypt_generic()的用法_Mcrypt函数
  • 前端几种下载文件
  • 出让土地使用权和转让土地使用权的区别
  • 丑八怪 英文
  • vue插槽类型
  • 知识图谱的构建方法有两种
  • php查询数据是否存在
  • 融资租入固定资产
  • 税控盘减免税款会计分录
  • 建筑业的账务处理方法
  • 预提和计提
  • 应收账款资产负债表负数
  • 暂估入库有风险吗
  • 库存盘点问题及改善对策
  • 存货跌价准备在借方表示什么
  • 外贸出口备案需准备什么资料
  • 固定资产丢失进哪个科目
  • 以前年度损益调整借贷方向
  • 调研费用包括哪些项目
  • 代扣缴纳税款会计分录
  • 装修公司让客户承担税费是否合理
  • 小规模纳税人免税政策2023年
  • 收到残保金退税现金流
  • 业务招待费有
  • 哪些进项的税可以退税
  • 黄金入账如何做会计分录
  • 外经证预缴税款必须去外地交税吗
  • 对公账户给私人账户转账,几天到账
  • 水利基金和印花税会计分录
  • 开餐饮店需要什么条件才能开
  • 出售房产收入属于转让财产收入吗
  • mysql日期和时间函数
  • mysql5.7.27安装
  • win7删除系统文件
  • win8怎么添加我的电脑到桌面
  • linux限制用户登录
  • xp的命令提示符在哪
  • Linux系统安全性体现在哪些方面?
  • linux防火墙放行
  • 笔记本win8为什么不能连无线
  • linux中的top命令
  • linux系列
  • Nodejs+express+html5 实现拖拽上传
  • nodejs 路由
  • 批处理压缩
  • js实现手风琴
  • 个人取得抽奖,购车抵用,需要缴纳个人所得税吗
  • 河北省国家税务局长简介
  • 怎么注册山东省政府采购网
  • 什么是印花税,印花税有哪些特点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设