昨天总结了一下ajax,今天顺便把跨域也说了吧。
在正常的情况下。是不允许跨域的。因为保证安全。大家要准守同源策略
同源策略
- 浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。
- 本域:相同的协议、 相同的域名、相同的端口
例:http://zhaobw.com:8080/test.html
http就是协议、zhaobw.com就是域名、8080就是端口。
跨域:
- 在浏览器下,向不同的协议、域名、端口,发送请求获取数据。突破同源策略。
跨域的方法:
- jsonp
- 降域
- cors
- postMassage
详细介绍跨域方法
jsonp
html中script标签可以引入其他域下的js,比如引入线上的jquery库。利用这个特性,可实现跨域访问接口。需要后端支持
-
定义数据处理函数_fun
-
创建script标签,src的地址执行后端接口,最后加个参数callback=_fun
-
服务端在收到请求后,解析参数,计算返还数据,输出 fun(data) 字符串。
-
fun(data)会放到script标签做为js执行。此时会调用fun函数,将data做为参数。。
<script type="text/javascript">
var list = document.querySelector("#list");
console.log(list);
var script = document.createElement("script");
console.log(script);
script.src = "http://a.zhaobw.com:8080/getList?callback=add";
document.head.appendChild(script);
function add(data){
list.innerHTML = data;
}
</script>
CORS
CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。 实现方式很简单,当你使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。所以 CORS 的表象是让你觉得它与同源的 ajax 请求没啥区别,代码完全一样。
res.header("Access-Control-Allow-Origin", "http://a.jrg.com:8080");
降域
在主域名相同, 二级域名不同的情况下。可以通过domian来进行设定
//qwe.a.html和asd.a.html
document.domian = "a.html"
#######postMessage
允许跨窗口通信,不论这两个窗口是否同源。postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即"协议+域名+端口"。也可以设为*,表示不限制域名,向所有窗口发送。
网友评论