TongtongGitHub / Blog

个人随笔,欢迎交流
0 stars 0 forks source link

跨域 #3

Open TongtongGitHub opened 7 years ago

TongtongGitHub commented 7 years ago

跨域根据不同情况可以采取不同的方法:

  1. 图片可以从任何URL中加载,所以将img的src设置成其他域的URL,即可以实现简单的跨域,可以使用onload和onerror事件来确定是否接受到了响应。 这种方式只能简单判断是否相应,无法传递数据。
    var img=new Image();
    //发送get请求
    img.src='http://stat.made-in-china.com/event/common.html?t=69&sw=led&si=4&c=3';
    //响应成功处理函数
    img.onload=function(){
    img = null;
    delete img;
    }
    //响应失败处理函数
    img.onerror=function(){
    img = null;
    delete img;
    }
  2. jsonp jsonp是带有回调函数callback的json,因为script的src可以跨域,所以在发送的URL后添加一个callback参数传递给服务器,然后服务器返回的数据会作为callback的参数,因为这个callback是我们自己来实现的,所以可以对接受到的json数据进行处理。 JSONP 的理念就是,我和服务端约定好一个函数名,当我请求文件的时候,服务端返回一段 JavaScript。这段 JavaScript 调用了我们约定好的函数,并且将数据当做参数传入。非常巧合的一点(其实并不是),JSON 的数据格式和 JavaScript 语言里对象的格式正好相同。所以在我们约定的函数里面可以直接使用这个对象。

简单写法:

    $.getJSON("http://stat.made-in-china.com/event/common.html?t=69&sw=led&si=4&c=3&callback=?",
        function(result) { 
            alert(result);
        } 
    ); 

        function jsonpCallback(){
            alert(callback);
        }
        $.ajax({
            type : "get",
            url : "http://xxx/event/common.html", //实际上访问时产生的地址为get请求
            data : {"t":69,"sw":"led","si":4,"c":3},
            dataType : "jsonp",
            jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
            jsonpCallback:"jsonpCallback",
                //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
                //如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用(重点)
            success : function(json){
                alert(success);
            },
            error:function(){
                alert("error");
            }
        });
  1. CORS 服务器 在响应头中设置相应的选项,浏览器如果支持这种方法的话就会将这种跨站资源请求视为合法,进而获取资源。

  2. document.domain 使用条件:

使用方法就是将符合上述条件页面的 document.domain 设置为同样的二级域名。这样我们就可以使用其他页面的 window 对象引用做我们想做的任何事情了。

  1. iframe https://segmentfault.com/a/1190000003642057 http://blog.csdn.net/dmtnewtons_blog/article/details/9301885 http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html https://segmentfault.com/a/1190000000702539