跨域

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文件供客户端调用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是跨域? 2.) 资源嵌入:、、、等dom标签,还有样式中background:url()、@font-fac...
    电影里的梦i阅读 2,397评论 0 5
  • 个人转载做笔记用 http://web.jobbole.com/88525/ 这里说的js跨域是指通过js在不同的...
    平谦阅读 418评论 0 7
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    w_zhuan阅读 547评论 0 0
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    他在发呆阅读 830评论 0 0
  • 10月份真的是忙成狗,一周三天上课,两天去实习,实习来回需要三个小时坐地铁,千字文计划不能放弃,跑步计划必须完成。...
    艾涤生微习惯3650天阅读 1,658评论 17 34