0

0

js中跨域的方法

小云云

小云云

发布时间:2017-12-09 16:58:24

|

1669人浏览过

|

来源于php中文网

原创

在制作oneday-music-player的时候要使用ajax向百度音乐的api发送请求,然后出现了XMLHttpRequest cannot load 'http://....' . No 'Access-Control-Allow-Origin' header is present on the request resource. Origin 'http://....' is therefore not allowed access,经过搜索发现是受到了同源策略的影响而导致的跨域问题,所以学习一下关于跨域的知识点。

同源策略

同源策略限制从一个源加载的文档或脚本与另一个源的文档或脚本进行交互的方式,是隔离潜在恶意文件的重要安全机制。

两个页面拥有同样的协议、端口(如果指定)和域名时,可以说两个页面是同源的。

下表是相对于http://store.company.com/dir/page.html同源检测的示例:

url 结果 原因
http://store.company.com/dir2/other.html 成功
http://store.company.com/dir/inner/other.html 成功
https://store.company.com/secure.html 失败 不同协议(httpshttp
http://store.company.com:81/dir/etc.html 失败 不同端口(81和80)
http://news.company.com/dir/other.html 失败 不同域名(newsstore

而如果非同源,则有三种行为会受到限制:

  • Cookie、LocalStorage和IndexDB无法读取

  • DOM无法获得

  • AJAX请求不能发送

规避同源策略(跨域)

Cookie

document.domain

Cookie是服务器写入浏览器的一小段信息,只有同院的网页才能共享。但是,两个网页一级域名相同,只是二级域名不同,浏览器允许通过document.domain共享Cookie

例如,假设文档中的一个脚本在http://store.company.com/dir/page.html执行以下语句:

document.domain = "company.com"

此时,http://news.company.com/dir/other.htmlhttp://store.company.com/dir/other.html
就可以通过document.cookie来设置或获取Cookie,即共享Cookie。

但是这种方法适用于Cookie和iframe窗口,LocalStorage和IndexDB无法通过这种方法规避同源策略。

iframe

如果两个网页不同源,就无法拿到对方的DOM,典型的例子是iframe窗口和window.open方法打开的窗口,如果和父窗口不同源,则会报错。

此时如果两个窗口一级域名相同,只是二级域名不同,那么设置document.domain属性,就可以规避同源策略。

而对于完全不同源的网站,目前有三种方法可以解决跨域窗口之间的通信问题。

  • 片段标识符(fragment identifier)

  • window.name

  • 跨文档通信API(cross-document messaging)

片段标识符

片段标识符(fragment identifier)指的是URL的#后面的部分,即http://store.company.com/dir/other.html#fragment#fragment(location.hash),如果只改变片段标识符,页面不会重新刷新。

父窗口可以把信息写入子窗口的片段标识符,子窗口通过监听hashchange事件得到通知。

window.name

每个iframe都有包裹它的window,这个window是top window的子窗户,所以自然有window.name属性,指的是当前窗口的名字,这个属性的最大特点是,无论是否同源,只要在同一个窗口里,窗口内所有页面对window.name都有读写的权限。

window.name的值只能是字符串的形式,这个字符串的最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器。

例如,想要在http://example/a.html中获取http://company.com/data.html中的数据,可以在a.html中使用一个隐藏的iframe,将iframe的src首先设置为http://company.com/data.html,将其window.name设置为所需的数据内容,随后再将这个iframe的src设置为跟a.html页面同一个域的一个页面,不然a.html获取不到该iframe的window.name

window.postMessage

这是html5中新引入的一个API,可以使用它向其它的window对象发送消息,无论这个window对象属于同源还是不同源。

例如,父窗口http://example/a.html向子窗口http://company.com/data.html发送消息:

var newWin = window.open('http://company.com/data.html', 'title')
newWin.postMessage('Hello World!'. 'http://company.com/data.html')

window.postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源,即协议+端口+域名,也可以设置为*,表示不限制域名。

子窗口向父窗口发送消息的写法类似:

window.opener.postMessage('Nice to see you', 'http://example/a.html')

子窗口和父窗口都可以通过message时间,监听对方的消息。

window.addEventListener('message', function(e) {
// ...
}, false)

message事件的事件对象event有以下三个属性:

  • event.source: 发送消息的窗口

  • event.origin: 消息发向的网址(可以限制目标网址)

  • event.data: 消息内容

通过window.postMessage,也可以读写其他窗口的localStorage

AJAX

同源策略规定,AJAX请求只能发给同源的网址,否则就报错,但是有三种方法可以规避这个限定:

  • JSONP

  • WebSocket

  • CORS

JSONP

JSONP是服务器与客户端跨源通信的常用方法。基本思想是利用请求脚本能够跨域访问的特性,先定义了一个回调方法,然后将其作为url参数的一部分发送到服务端,服务端通过字符串拼接的方式将数据包裹在回调方法中,再返回回来。

// 网页动态插入`
                

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号