JavaScript跨域方法学习总结

JavaScript跨域:

URL

说明

是否允许通信

http://www.a.com/a.js 
  http://www.a.com/b.js

同一域名下

允许

http://www.a.com/lab/a.js 
  http://www.a.com/script/b.js

同一域名下不同文件夹

允许

http://www.a.com:8000/a.js 
  http://www.a.com/b.js

同一域名,不同端口

不允许

http://www.a.com/a.js 
  https://www.a.com/b.js

同一域名,不同协议

不允许

http://www.a.com/a.js 
  http://70.32.92.74/b.js

域名和域名对应ip

不允许

http://www.a.com/a.js 
  http://script.a.com/b.js

主域相同,子域不同

不允许

http://www.a.com/a.js 
  http://a.com/b.js

同一域名,不同二级域名(同上)

不允许(cookie这种情况下也不允许访问)

http://www.cnblogs.com/a.js 
  http://www.a.com/b.js

不同域名

不允许

 

JavaScript请求了不属于自己所在域的资源,违反了同源策略,由此产生跨域。

跨域的分类:

(1)协议不同,比如httphttps

(2)域名或ip不同。

(3)端口不同。

 

跨域解决方案:

1script标签跨域方案。

Script标签并无同域策略限制,是可以跨域获取脚本文件的。

客户端代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
 
        var result = null;
        window.onload = function () {
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.src = "http://192.168.0.101/ExampleBusinessApplication.Web/web2.aspx";
 
            var head = document.getElementsByTagName("head")[0];
            head.insertBefore(script, head.firstChild);
 
        };
 
        function callback(data) {
            result = data;
        }
 
        function b_click() {
            alert(result.name);
        }
    </script>
</head>
<body>
    <input type="button" value="click me!" onclick="b_click();" />
</body>
</html>

服务端代码:

protected void Page_Load(object sender, EventArgs e)
        {
            string result = "callback({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";
 
            Response.Clear();
            Response.Write(result);
            Response.End();
        }

2jsonp跨域方案。

Jsonp的实现原理即是script标签跨域方式。

Jsonp跨域的服务端和script标签跨域是一样的,都要用callback(+data+)格式返回数据;

服务端代码:

protected void Page_Load(object sender, EventArgs e)
        {
            string callback = Request.QueryString["jsoncallback"];//从请求头中获取callback方法名
            string result = callback + "({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";
 
            Response.Clear();
            Response.Write(result);
            Response.End();
        }

客户端代码:

$.ajax({
                async: false,
                url: "http://192.168.0.5/Web/web1.aspx",
                type: "GET",
                dataType: 'jsonp',
                //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象.
                jsonp: 'jsoncallback',
                //要传递的参数,没有传参时,也一定要写上 
                  data: null,
                timeout: 5000,
                //返回Json类型 
                  contentType: "application/json;utf-8",
                //服务器段返回的对象包含name,data属性.
                success: function (result) {
                    alert(result.date);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });

3document.domain跨子域方案。

所谓跨子域,就是通过设置document.domain将两个不同域的资源放在同一个父域下面,然后两者就可以正常交互了。

A页面代码(http://www.example.com/a.html)

<html>
<head>
  <script>
   document.domain = "example.com";
    function aa(){
      alert("p");
   }
  </script>
</head>
<body>
   <iframe src="http://example.com/b.html" id=”i”>
  
   </iframe>
   <script>
  document.getElementById('i').onload = function(){
          var d = document.getElementById('i').contentWindow;
          d.a();
          
 };
   </script>
 </body>
</html>

B页面代码(http://example.com/b.html)

<html>
 <head>
  <script>
    document.domain = " example.com";
    function a(){
    alert("c");
     }
  </script>
 </head>
 <body>
 </body>
</html>

注意:document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:www.org.example.com 中某个文档的document.domain 可以设成www.org.example.comorg.example.com example.com中的任意一个,但是不可以设成 ftp.www.org.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。

注意:document.domain的跨域必须是依托于一个html通过iframe的代理链接到另一个html,如果是ajax直接访问,这是行不通的。

主页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>跨域获取数据</title>
    <script type="text/javascript">
    function domainData(url, fn)
    {
        var isFirst = true;
        var iframe = document.createElement('iframe');
        iframe.style.display = 'none';
        var loadfn = function(){
            if(isFirst){
                iframe.contentWindow.location = 'http://a.com/null.html';
//动态生成iframe载入a页面。
                isFirst = false;
            } else {
                fn(iframe.contentWindow.name);
                iframe.contentWindow.document.write('');
                iframe.contentWindow.close();
                document.body.removeChild(iframe);
                iframe.src = '';
                iframe = null;
            }
        };
        iframe.src = url;
        if(iframe.attachEvent){
            iframe.attachEvent('onload', loadfn);
        } else {
            iframe.onload = loadfn;
        }
        
        document.body.appendChild(iframe);
    }
    </script>
</head>
<body>
 
</body>
    <script type="text/javascript">
    domainData('http://b.com/data.html', function(data){
        alert(data);
    });
</script>
</html>

B页面代码:

<script>
  window.name = '需要跨域传递的数据';
</script>

 

4window.name跨域方案。

Windowname属性存在于一个窗口的生命周期内,即使用window.location载入的界面都会共享这个name属性,且不会重置。

因此,可以我们可以通过这个name属性传递想要的数据。

主页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>跨域获取数据</title>
    <script type="text/javascript">
    function domainData(url, fn)
    {
        var isFirst = true;
        var iframe = document.createElement('iframe');
        iframe.style.display = 'none';
        var loadfn = function(){
            if(isFirst){
                iframe.contentWindow.location = 'http://a.com/null.html';
//动态生成iframe载入a页面。
                isFirst = false;
            } else {
                fn(iframe.contentWindow.name);
                iframe.contentWindow.document.write('');
                iframe.contentWindow.close();
                document.body.removeChild(iframe);
                iframe.src = '';
                iframe = null;
            }
        };
        iframe.src = url;
        if(iframe.attachEvent){//判断是否为IE浏览器,因为IE支持attachEvent
            iframe.attachEvent('onload', loadfn);
        } else {
            iframe.onload = loadfn;
        }
        
        document.body.appendChild(iframe);
    }
    </script>
</head>
<body>
 
</body>
    <script type="text/javascript">
    domainData('http://b.com/data.html', function(data){
        alert(data);
    });
</script>
</html>

B页面代码:

<script>
  window.name = '需要跨域传递的数据';
</script>

5HTML5window.postMessage跨域方案。

A页面代码:

<script>
function onLoad(){
var iframe=document.getElementById(‘iframe’);
var win=iframe.contentWindow;
win.postMessage(“你好”,*);//第一个参数为需要传递的消息,第二个为接收消息的域,可以为通配符。
}
</script>

B页面代码:

<script>
Window.onmessage=function(e){//注册事件接收消息;
e=e||event;//获取时间对象
alert(e.data);
}

</script>

6cors跨域方案。

在服务器为response响应头添加跨域许可,可以使用通配符“*”。

(跨域请求可以是post方式或者get方式请求。)

服务端:

header("Access-Control-Allow-Origin: 
http://www.a.com
");

客户端代码:

$.ajax("www.cros.com/api/data", { 
  type: "GET", 
  xhrFields: { 
    withCredentials: true
  }, 
  crossDomain: true, 
  success: function(data, status, xhr) { 
  } 
});

 

 本篇以摘抄、收集为主。

参考文档:

http://www.cnblogs.com/oneword/archive/2012/12/03/2799443.html

http://www.cnblogs.com/zjfree/archive/2011/02/24/1963591.html

http://narutolby.iteye.com/blog/1464436

http://www.cnblogs.com/2050/p/3191744.html



转载于:https://my.oschina.net/varusyan/blog/404310

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值