1.含义:
在不同的域之间进行数据传输和通信
2.起因:
语言安全限制中的同源策略
同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,同一来源是指主机名、协议和端口号的组合。
3.分类:
(1)主机不同
(2)主域相同子域不同a.c.com和b.c.com
(3)主域不同www.a.com和www.b.com
端口不同www.a.com:8080和www.a.com:8088
协议不同http://www.a.com和https://www.a.com
端口和协议不同而造成的跨域问题只能通过后台代理解决。
4.解决方案:
(1)基于iframe实现跨域
基于iframe实现的跨域要求两个页面属于同一基础域。
在发起方页面和接收方页面设置document.domain,并将值设为父域的主域名(window.location.hostname);
在发起方页面动态创建一个隐藏的iframe,iframe的src是接收方页面地址。
(2)基于script标签实现跨域
script标签本身就可以访问其他域的资源,不受浏览器同源策略的限制。在发起方页面动态加载一个script,script的url指向接收方页面地址,该页面必须生成返回JS数据,另外url后可以传递参数,该方法只支持GET方式提交参数。
方式一:客户端创建函数对象callFunc,以接收服务器返回的JS数据并对其进行处理,服务器端直接调用客户端callFunc函数并传递参数。
服务器端:
callFunc({key:'value'});
方式二:客户端向服务器传送参数;服务器端接收该参数并将其连接于返回数据之前。
客户端:
function callFunc(data){
console.log(data.key);
};
//通过callback参数指定回调函数
var url="跨域文件路径?callback=callFunc";
var script=document.createElement('script');
script.setAttribute('src',url);
document.getElementsByTagName('head')[0].appendChild(script);
服务器端:
$_user = array('username'=>'chen','password'=>'123');
$_callback =$_GET['callback'];
echo$_callback.'('.json_encode($_user).')';
?>
(1)后台代理方式
方式一:callback参数
客户端:
$.ajax({
type:"GET",
url:"http://remote.com/domain.jsp?callback=?",
dataType:"json",
success:function(response,status,xhr){
console.log(response);
}
});
方式二:jsonp
客户端:
$.ajax({
type:"GET",
url:"http://remote.com/domain.jsp",
dataType:"jsonp",
success:function(response,status,xhr){
console.log(response);
}
});
服务器端:
<%
Stringcallback=request.getParameter("callback");
out.print(callback+"({\"username\":\"chen\",\"password\":\"123\"})");
%>
JSONP:一种非官方的跨域数据交互协议,允许用户传递一个callback参数给服务器,然后服务器返回数据时将此callback参数作为函数名包裹住JSON数据,使得客户端可以随意定制自己的函数来自动处理返回数据,两种数据描述{},[]。
(1)Web页面可跨域调用JS文件。(有src属性的标签都具有跨域能力)
(2)跨域服务器动态生成数据并存入JS文件供客户端调用。