浏览器中使用JS跨域获取数据的几种方式

浏览器中使用JS跨域获取数据的几种方式

需要了解的前提

URL:统一资源定位符,是互联网上资源的网址
例如:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name在这里插入图片描述

  1. 协议部分:该URL的协议部分为"http:",这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,HTTPS,FTP等等,本例子中使用时HTTP协议。在"HTTP"后面的"//"为分隔符。
  2. 域名部分:该URL的域名部分为"“www.aspxfans.com"。一个URL中,也可以使用IP地址作为域名使用。
  3. 端口部分:跟在域名后面的都是端口,域名和端口之间使用":"作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将会采用默认端口。
  4. 虚拟目录部分:从域名后的第一个"/“为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例子中的虚拟目录是”/news/"。
  5. 文件名部分:从域名后的最后一个"/“开始到”?“为止,是文件名部分,如果没有”?",则是从域名后的最后一个"/“开始到”#“为止,是文件部分,如果没有”?“和”#",那么从域名后的最后一个"/“开始到结束,都是文件名部分。本例子的文件名师"index.asp”。文件部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
  6. 参数部分:从"?“开始到”#“为止之间的部分为参数部分,又称为搜索部分、查询部分。本例子中的参数部分为boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用"&"作为分隔符。
  7. 锚部分:从"#“开始到最后,都是锚部分。本例子中的锚部分是"name”。锚部分也不是一个URL必须的部分。

如果通过浏览器访问页面的?

当我们打开浏览器,在浏览器的地址栏中输入URL地址http://www.gacl.cn:8080/WebDemo1/1html去访问服务器上的1.html这个web资源的过程中,浏览器和服务器都做了什么操作呢,我们是怎么在浏览器里面看到1.html这个web资源里面的内容的呢?

浏览器和服务器做了以下几个操作:

  1. 浏览器根据主机名"www.gacl.cn"去操作系统的Hosts文件中查找主机名对应的IP地址。
  2. 浏览器如果在操作系统的Hosts文件中没有找到对应的IP地址,就去互联网上的DNS服务器上查找"www.gacl.cn"这台主机对应的IP地址。
  3. 浏览器查找到"www.gacl.cn"这台主机对应的IP地址后,就使用IP地址连接到web服务器。
  4. 浏览器连接到web服务器已Stream(流)的形式传输数据,告诉web服务器要访问服务器里面的那个web应用下的web资源。
  5. 浏览器做完上面4步工作后,就开始等待,等地啊web服务器把自己想要访问的1.html这个web资源传输给它。
  6. 服务器接收到浏览器传输的数据后,开始解析接收到的数据,服务器解析"GET /WebDemo1/1.html "里面的内容时知道客户端浏览器要访问的是WebDemo1应用里面的1html这个Web资源,然后服务器就去读取1.html这个Web资源里面的内容,将读到的内容再以Stream(流)的形式传输给浏览器。
  7. 浏览器拿到服务器传输给它的数据之后,就可以吧数据展现给用户了。

相同域

在客户端编程语言中,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。

当两个域具有相同的协议,相同的域名,同端口,说明这是相同域,其中任意一个不同,都属于跨域。

受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来罗列出常见的一些跨域方式.

单项跨域

JSONP

JSONP(JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标记来动态加载其他域的资源。
在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的,但是,众所周知,script的标签有一个src属性,指向一个地址,加载成功之后就可以成功调用里面的文件。那么,我们可以以这种形式,进行跨域访问。jsonp正是利用这个特性来实现的。

举个例子
//script可以跨域
//需要跨域的时候可以创建一个script标签
var jsonp = document.createElement("script");
//指定类型
jsonp.type = "text/javascript";
//添加链接地址
jsonp.src = "http://10.0.154.249/text.js?callback=jsonpCallback";
//将这个拼接 好的script标签添加到head标签中。
document.getElementsByTagName("head")[0].appendChild(jsonp);
//回调函数
function jsonpCallback(ret){
    alert(ret)
}

在异地服务器中,有一个text.js文件,我们只要把需要传输的数据,以参数的形式,传递到我们的回调函数中就可以了。

异地服务中text.js文件内容
jsonpCallback("饭饭爱分享");
运行结果

在这里插入图片描述
当然上例也可以直接写一个script标签引入一个js文件,这个js文件载入成功后会执行我们在URL参数中指定的函数,并且会把我们需要的json数据作为参数传入。所有jsonp是需要服务器的页面进行相应的配合的。
如果你的页面使用jQuery,那么通过它封装的方法就能很方便的来进行jsonp操作了。

<script>
$.getJSON(''http://10.0.154.249/text.js?callback=?",function(ret ){
    alert(ret)
})
</script>

原理是一样的,只不过我们不需要手动的插入script标签以及定义回调函数。jQuery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据
后又会自动销毁,实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法,跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。
JSON易于实现,但是也会存在一些安全隐患,如果第三方的脚步随意的执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSON是非常合适的选择。

window.name

window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中。当然,如果有需要,其中的任何一个页面都可以对window.name的值进行修改。并不会因新页面的载入而进行重置。
注意,window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,但一般是够用了。

举个例子

比如有一个www.example.com/a.html页面,需要通过a.html页面里的Js来获取另外一个位于不同域上的页面www.cnblogs.com/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.cnblogs.com/data.html就行了。然后a.html想要得到iframe所获取到的数据,也就是想要得到iframe的window.name的值,还必须把这个iframe的src设成跟a.html页面同一个域才行,不然根据前面讲的同源策略,a.html是不能访问到iframe里的window.name属性的。这就是整个跨域过程。
看下a.html页面的代码:
在这里插入图片描述
上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe。

双向跨域

document.domain

浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点需要说明,不同的框架之间(父子或同辈),是能够获取到彼此的window对象的,但是你却不能使用获取到的window对象的属性和方法(html5中的postMessage方法是一个例外),
比如有一个页[http://www.example.com/a.html](http://www.example.com/a.html),这个页面里面有一个iframe,它的src是http://example.com/b.html 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的。
在这里插入图片描述
但是我们可以使用document.domain,我们只要把http://example.com/a.htmlhttp://example.com/b.html这两个页面的document.domain都设成相同的域名就可以了。但要注意的是,document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a.b.example.com 中某个文档的document.domain 可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成 c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。
http://example.com/a.html中设置document.domain
在这里插入图片描述
在页面 http://example.com/b.html中也设置document.domain,而且这也是必须的,虽然这个文档的domain就是example.com,但是还是必须显示的设置document.domain的值.
在这里插入图片描述
这样我们就可以通过js访问到iframe中的各种属性和对象了。
不过如果你想在http://www.example.com/a.html页面中通过ajax直接请求http://example.com/b.html页面,即使你设置了相同的document.domain也还是不行的,所以修改document.domain的方法只适用于不同子域的框架间的交互。
如果你想通过ajax的方法去与不同子域的页面交互,除了使用jsonp的方法外,还可以用一个隐藏的iframe来做一个代理。原理就是让这个iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面,所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的,然后就是通过我们刚刚讲得修改document.domain的方法,让我们能通过js完全控制这个iframe,这样我们就可以让iframe去发送ajax请求,然后收到的数据我们也可以获得了。

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不支持,所以用不用还得根据实际需要来决定。

本文参考1:http://web.jobbole.com/88525/
本文参考2:http://www.educity.cn/wenda/53094.html
本文参考3:https://www.jianshu.com/p/c71c20e98f94

哎呀呀(^^)
关注 关注
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端的几种解决方式总结(推荐)
01-21
搞大前端的,肯定都会遇到问题的,虽然网上这方面的资料也很多,但我还是喜欢自己写一遍,自己理解过、总结过的东西才记得最深刻。 同源策略 JavaScript 的同源策略,是由Netscape提出的一个著名的安全策略,为了阻止A站的JS去操作别的网站的数据。你想啊,你现在打开了浏览器,在一个tab窗口打开了银行网站,在另外一个tab窗口打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改(比如说获取你的卡号和密码,又或者是转账到黑客的账户上等等),后果会非常严
常见的javascript通信方法
01-19
本文主要介绍几种常见的javascript通信方法。首先讲解一下JSONP。 1、JSONP JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的[removed] 元素是一个例外。利用 [removed] 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是JSON,而是任意的JavaS
有关浏览器使用js获取数据的描述
qq_43246404的博客
07-14 1381
1.只要协议、名、端口有任何一个不同,都被当作是不同的。 2.js可以使用jsonp进行。 3.通过修改document.domain来。 4.使用window.name来进行。 ...
JS获取数据
ibuhappy的博客
03-14 180
项目遇到一个需求,数据是通过获取的,在百度查了下,获取数据主要有以下几种方式:   A. 嵌套iframe;   B.服务器端充当转代理方式有很多可以由服务器端程序实现,也可以修改服务器配置实现,下面举例Apache 重写( mod_rewrite proxy 模式)方式: 在Apache 的安装目录下的 conf/httpd.conf  文件添加如下语句...
浏览器访问操作js如何实现?
qq_43536020的博客
10-31 203
浏览器将自动处理请求,如果服务器响应的CORS头部设置正确,则允许访问。这种方法允许在的窗口之间进行安全的数据交换,但需要前后端共同配合实现。浏览器访问操作是指在浏览器,一个网页的JavaScript代码试图向不同名、不同协议或不同端口的资源发起请求时所涉及的安全机制。需要注意的是,虽然上述方法可以实现访问,但它们都需要服务器端的支持或特殊的前端代码处理。然而,在某些情况下,我们可能需要进行访问,例如在前端使用AJAX请求不同上的数据
JS获取另一个frame的元素的值
asdf_2012的专栏
11-24 9793
var deviceType = parent.window.frames["locksetFrame"].document.getElementById("key_lock").value; console.log(deviceType);
传参问题与解决方案
折翼只为爱
07-21 1037
(Domain)是Windows网络独立运行的单位,之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在之间的桥梁。当一个与其他建立了信任关系后,2个之间不但可以按需要相互进行管理,还可以网分配文件和打印机等设备资源,使不同的之间实现网络资源的共享与管理。有一种简明的说法来解释广访问,简单来说就是 A 网站的 javascript ...
如何用javascript实现一个请求并获取返回的数据?请给出具体的实现方法。
2201_75662279的博客
08-16 569
【代码】如何用javascript实现一个请求并获取返回的数据?请给出具体的实现方法。
js几种实用的方法原理详解
2301_78008478的博客
06-25 2120
例如:a.b.example.com 某个文档的document.domain 可以设成a.b.example.com、b.example.com 、example.com的任意一个,但是不可以设成 c.a.b.example.com,因为这是当前的子,也不可以设成baidu.com,因为主已经不相同了。上面的例子,我们用到的页面a.html和b.html是处于同一个的,但是即使a.html与b.html处于不同的,上述结论同样是适用的,这也正是利用window.name进行的原理。
前端考试题总结
m0_38135164的博客
03-12 1381
前端知识的积累(1)
完美解决浏览器的几种方法(汇总)
12-03
在页面使用js访问其他网站的数据时,就会出现问题,比如在网站使用ajax请求其他网站的天气、快递或者其他数据接口时,以及hybrid app请求数据浏览器会提 示一下错误: XMLHttpRequest cannot load ...
探讨请求资源的几种方式(总结)
11-29
请求资源的几种方式,具体如下: 1.什么是 2.JSONP 3.proxy代理 4.cors 5.xdr 由于浏览器同源策略,凡是发送请求url的协议、名、端口三者之间任意一与当前页面地址不同即为。具体可以查看下表 ...
JSONP解决JS问题的实现
11-20
由于浏览器同源策略的限制,非同源下的请求,就会产生问题。解决问题的方法有很多种,例如CORS(cross orign resources share)和JSONP。这里我就着重介绍一下jsonp的解决方案。 一:基础概念 同源策略:同一...
javascript通信
橙煦媛的博客
03-02 360
1.CORS CORS(Corss-Origin Resource Sharing,资源共享),基本思想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应的成功或失败。即给请求附加一个额外的Origin头部,其包含请求页面的源信息(协议、名和端口),以便服务器根据这个头部决定是否给予响应。 2.document.domain 将页面的document.domain设置
使用spring写一个ldap账号禁用程序
weixin_42608299的博客
02-09 170
可以使用Spring LDAP来编写一个账号禁用程序,它支持基于LDAP的账号禁用和启用操作。它可以使用LDAP API来查询和更新LDAP账号的状态,以及在禁用账号时执行其他操作,如发送通知邮件等。 ...
如何通过网页获取该网站的js框架
u013455430的专栏
01-21 1861
昨天正在吃鸡ing,3杀就快决赛圈了,突然老师丢给三个网站链接,让我去查查他们用的什么js框架。。。 讲道理,刚看到这个问题的时候我也是头皮一麻 怎么可能通过网页就能看到人家是啥框架?人家不都封装过了吗? 那些写这个网站的都是傻×吗?随便就让你看核心js框架啊? 经过两天的实验和查资料,貌似也是可以看查到的,毕竟人无完人,总有百密一疏的时候。 当然这只是我尝试过的一些方法,我的问题解决了...
js缓存三种方法
热门推荐
qq_41241504的博客
10-24 1万+
1.使用sessionStorage、localStorage存储数组与对象 localStorage对象是HTML5的客户端存储持久化数据的方案。为了能访问到同一个localStorage对象,页面必须来自同一个名(子名无效),使用同一种协议,在同一个端口上。 过期策略:localstorage永久存储,不过期,除非手动删除,sessionstorage在重启浏览器、关闭页面或新开页面时失效。 localStorage是Storage类型的实例。有以下的几种方法: ①clear():删除所有值
系统数据库取数实现方案
fenyu8的专栏
08-27 2682
情景:假如要做一个帐套A的报表,但其部分字段的取值在帐套B
前端性能优化:提升网站加载速度的终极指南
最新发布
喔的嘛呀的博客
06-07 1024
综上所述,通过以上优化方案和具体措施,我们可以有效地提升网站的加载速度,改善用户体验,提高转化率,从而在激烈的市场竞争脱颖而出,取得更好的业绩和口碑。作为前端工程师,我们应该不断学习和探索,不断优化和提升网站性能,为用户创造更好的上网体验。
JS获取指定网页代码
06-08
在同源策略的限制下,JavaScript 是不能直接获取指定网页的代码的。但是,可以通过以下几种方式来实现获取指定网页代码: 1. 服务器端代理:使用服务器端代理,将要获取的网页请求发送到服务器端,由服务器端代为获取网页内容,再将获取到的内容返回给客户端。客户端可以通过 Ajax 或者 WebSocket 向自己的服务器发送请求,然后服务器端向目标服务器发送请求并将获取到的数据返回给客户端。 2. JSONP:JSONP 是一种请求数据方式,它利用了 script 标签可以请求资源的特性。客户端在网页创建一个 script 标签,将要请求的数据通过回调函数的方式传递过来,从而实现获取指定网页的代码。 3. CORS(资源共享):CORS 是一种允许浏览器服务器发送 XMLHttpRequest 请求的机制,需要在服务器端设置响应头信息来允许请求。客户端可以使用 XMLHttpRequest 对象来发起请求,如果服务器端设置了相应的响应头信息,浏览器就可以接收到服务器端返回的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 浏览器中使用JS跨域获取数据的几种方式 2937
  • 浏览器中使用js跨域获取数据 508
  • 前端知识复习 468

最新文章

  • 浏览器中使用js跨域获取数据
  • 前端知识复习
2020年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司山南SEO按天扣费报价塘坑外贸网站建设推荐成都高端网站设计公司绍兴推广网站多少钱林芝至尊标王报价濮阳SEO按天收费价格忻州关键词排名公司阜新网站优化推广公司中卫seo信阳模板制作公司承德网站排名优化公司渭南建设网站多少钱烟台网站搜索优化推荐和县网站建设报价海南seo网站优化推荐民治百度网站优化海南百度竞价包年推广报价沙井网站搭建价格石家庄高端网站设计价格宁德网站关键词优化价格周口百度爱采购林芝关键词排名哪家好安庆营销型网站建设多少钱伊春百搜标王公司阿坝百搜标王价格鹤岗SEO按效果付费公司威海建站报价临猗模板制作哪家好兰州SEO按天扣费价格重庆阿里店铺托管公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化