JS之跨域
今天学了跨域,迫不及待想跟大家分享!不妥之处希望大家指正。
首先来明确一下“跨域”这个概念。
跨域指的是,到外域去取数据。那什么是“外域”呢?我们先来了解同域。同域指的是,同协议、同域名、同端口。如果两个URL,协议相同,域名相同,端口号相同,那么这两个URL就属于同域。那么外域就是,协议不同,或者域名不同,或者端口号不同。注意,这三者只要其中一个不同,就不属于同域。
我们看看例子:
http://www.jianshu.com/a.html
http://www.jianshu.com/b.html
//同域。协议相同,域名相同,端口号相同(默认80端口)
http://a.jianshu.com
http://b.jianshu.com
//不同域。域名不同
https://www.jianshu.com
http://www.jianshu.com
//不同域。协议不同
举例完毕,接下来将会讲讲以下三种跨域的方式。
- CORS
- 降域
- JSONP
CORS
CORS全称是跨域资源共享(Cross-Origin Resource Sharing),是一种Ajax跨域请求资源的方式。实现方式很简单,当你使用XMLHttpRequest发送请求时,如果该请求不符合同源策略,浏览器会给该请求加一个请求头:Origin,而后台会在返回结果中加一个响应头:Access-Control-Allow-Origin,浏览器判断该响应头是否包含Origin的值,如果包含,浏览器就会处理响应,我们就可以拿到数据;如果不包含,浏览器就会直接驳回,我们就拿不到数据。
那么怎么做才能让我们跨域拿到数据呢?很简单,我们只需在远程文件中加上这一行代码:
header("Access-Control-Allow-Origin","允许请求的URL,*为允许全部")
比如, header("Access-Control-Allow-Origin","http://www.jianshu.com")会允许来自 http://www.jianshu.com 的请求,而 header("Access-Control-Allow-Origin","*")会允来自任何域的请求。
降域
如果我们从 a.jianshu.com 请求 b.jianshu.com 的数据,像这种子页面不相同的情况就是适合利用降域来跨域了。实现起来也很简单,只需在本地文件和远程文件都加上这句代码:
document.domain="jianshu.com"
也就是说,直接把主网页的域名写上就可以了,这样就实现了利用降域来跨域。
JSONP
好了,重点来了,JSONP是非常常用的跨域方法,它通过动态创建script标签来实现跨域。
众所周知,通过script来加载外部文件是不存在同源策略的限制的,我们可以请求任何域的文件而不需要跨域。确切的说,任何含有src或者href属性的标签都不存在同源策略的限制。利用这个特点,我们把远程文件的URL放到script标签的src中,这样就得到了远程文件中的数据,然后把这些数据作为参数传入一个函数,就可以按自己需求处理和呈现了。我们看看具体怎么实现:
//远程数据地址
var url="http://api.jianshu.com/getSong.php?callback=handler";
//创建script标签
var script=document.createElement('script');
//把script标签src设为远程数据地址
script.setAttribute('src',url);
//把script标签加到head中
document.getElementsByTagName('head')[0].appendChild(script);
//回调处理函数
function handler(data){
//some code here...
}
注意,要在远程数据地址尾部加上回调函数名, 服务器会动态用这个函数名包裹住数据,也就是将数据作为这个函数的参数,这样返回到本地之后就可以执行相应函数了。
举个栗子,当我们以callback为getCity请求数据,服务器返回了的数据是这样的:
getCity(
{"city":
[
{
"name":"广州",
"cid":"578"
},
{
"name":"厦门",
"cid":"586"
}
]
}
)
我们的getCity函数是这样的:
function getCity(data){
console.log(data.city[0].name);
}
这样我们就log出了广州,跨域成功!是不是很简单啊!
好了,跨域就讲这么多。欢迎交流,欢迎指正!
原创文章,转载请注明出处!
JS之跨域的更多相关文章
- js执行跨域请求
//js执行跨域请求 var _script = document.createElement('script'); _script.type = "text/javascript" ...
- js调用跨域
web aapi 初体验 解决js调用跨域问题 跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user http:IP:8002/api/user 不同IP不同 ...
- js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...
- react-native debug js remotely跨域问题
react-native debug js remotely跨域问题 我们在安卓真机上调试react-native时,启用debug js remotely的时候,会出现跨域问题.这个时候我们只需要一 ...
- JS JSOP跨域请求实例详解
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...
- JS Ajax跨域访问
js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...
- js原生跨域--用script标签实现
刚刚从培训班学习完,总想写一下东西,自从进入了这个院子,每次出现问题,总是能找到一些答案,给我一些帮助. 作为新手,就写一下简单的吧,院子里面有很多大牛, 说句实话,他们的很多代码我都看不懂. 我就写 ...
- 后台访问 JS解决跨域问题
今天看了看以前做的一个小项目(其实就是一个页面),分享一下当时解决跨域问题的: 背景:公司把项目部署在多台服务器上,防止一台服务器崩溃后,其他的可以继续访问,对应本公司来说,某台服务器出问题后,技术人 ...
- 【js跨域】js实现跨域访问的几种方式
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 如何处理js的跨域问题
在bill.mail.10086.cn域内访问smsrebuild1.mail.10086.cn下的接口出现“阻止跨域源请求” 例如: URL 说明 是否允许通信 http://www.a.com/a ...
随机推荐
- iOS开发之应用内检测手机锁屏,解锁状态
iPhone的锁屏监测分为两种方式监听: 1. 程序在前台,这种比较简单.直接使用Darwin层的通知就可以了: #import <notify.h> #define Notificati ...
- mysql DB server端,如何让读写更快
其实,我不是专业的DB管理同学,甚至算不上会了解.只是在最近的工作中,遇到了DB server端优化的契机,所以把这些手段记录下来: 通过调整这个参数的值,可以让DB更给力: 这两个参数的含义: 1. ...
- java--遍历自定义数组
比如像下面这样 for (int i : new int[]{1,4,8}){ System.out.println(i); } 或者这样: for (String i : new String[]{ ...
- 在自己的对象里实现IEnumerator和IEnumerable
平时工作中我们经常用foreach来迭代一个集合.比如 foreach (Student student in myClass) { Console.WriteLine(student); } 基本所 ...
- HDU 3487 Play with Chain(Splay)
题目大意 给一个数列,初始时为 1, 2, 3, ..., n,现在有两种共 m 个操作 操作1. CUT a b c 表示把数列中第 a 个到第 b 个从原数列中删除得到一个新数列,并将它添加到新数 ...
- 一种读取Exchange的用户未读邮件数方法!
已好几个月没写博客了,由于之前忙于开发基于Sharepoint上的移动OA(AgilePoint)和采用混合移动开发技术开发一个安卓版的企业通讯录APP(数据与lync一致),并于1月初正式上线.马年 ...
- 关于welcome-file-list(欢迎页)不起作用的解决办法
今天我遇到了一个问题,就是直接输入http://localhost:8080/xxx-admin/,不是跳转到index.html,而是报404找不到的错误,根据错误信息看明显是没有跳转到index. ...
- zepto - scrollLeft
<div style="border:1px solid black;width:100px;height:130px;overflow:auto"> The long ...
- 让文档和Demo生成更加简单和强大 - SmartDoc 0.1.1 说明
新特性 smartDoc 0.1.1版正式发布,其中加入了更多方便生成文档的功能,主要特性如下: * 加入@demo配置项,看可以动态抓取html和js的内容作为@example,同时支持扩展@dem ...
- java io系列06之 序列化总结(Serializable 和 Externalizable)
本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...