zoukankan      html  css  js  c++  java
  • 跨域的几种方式

    目前了解的有五种方式

    1jsonp【get】大小有限制

    2document.domain只支持同一个域下不同子域跨域

    3、form表单+document.name+iframe跨域【post+get】有兼容性问题,不兼容ie,谷歌

    4、Flash URLLoader:【post+get】

    5、Access-Control-Allow-Origin【post+get跨域】

    下面来具体讲解每种跨域的方式

    1、jsonp的原理是创建一个script标签来访问外域的js,jquery封装好了jsonp的跨域,例如:  

     1 $.ajax({
     2     url:'http://s.hc360.com:8080/search_mark/mark',
     3     type:'get',
     4     data:dataArr,
     5     dataType:'jsonp',
     6     jsonp:'callback',
     7     jsonpCallback:'fn',
     8     success:function(){
     9 
    10     }
    11 })
    请求的接口是:http://s.hc360.com:8080/search_mark/mark/?callback=fn;,dataType返回的必须是jsonp格式,否则会走到error里面,jsonp是跟后台约定的参数,默认是callback,jsonpCallback:是定义的回调函数的名字,默认jquery会随机生成一个名字;

    2、修改document.domain,但是只适合在不同的子域名直接跨域;

    如:map.baidu.com和www.baidu.com之间,把它们的document.domain="baidu.com"就可以通过js互相操作数据了。

    3、form表单+document.name

    在页面创建一个form和一个iframe,把form的action设置成要提交的url,target设置成ifram的name属性,method设置为提交方式
    <form id="searchform" name="test_form" method="post" action="http://s.hc360.com:8080/search_mark/mark/" target="test_iframe">
    <input type="hidden" name="content" value="name=jyy" />
    </form>
    <iframe id="test_iframe" name="test_iframe"  style="display:none"></iframe>

      点击提交按钮的时候,把form里面的value设置成你要往后台传输的数据,然后执行form的submit事件。后端获取到数据后,设置window.name的值,并且一定要设置返回的数据类型是:

    Content-Type:text/html;charset=utf-8;然后返回下面代码: 

     1 html><head></head><script>window.name='1';</script><body></body></html> 

      监听ifram的onload事件,让ifm跳转到一个空页面或者是当前域的页面,当跳转成功后,这个时候就不存在跨域问题了,就可以拿到后台返回的name值了,但是contentWindow有兼容性,在ie和谷歌里面获取的不是后台设置的值,这点要注意

     1                var frm = $('#searchform');
     2                 frm.find('input[name="content"]').val(valData);
     3                 frm.submit();
     4                 var ifm = document.getElementById('test_iframe');
     5                 var flag=0;
     6                 ifm.onload=function(){
     7                     if(flag==0){
     8                         flag=1;
     9                         this.contentWindow.location.href='about:blank';
    10                     }else if(flag==1){
    11                         var dataName = this.contentWindow.name;
    12                         alert(dataName);
    13                     }
    14                 };
    4.flash跨域
    1 <object id="swfhttprequest" class="hidden" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0">
    2         <param name="movie" value="swfhttprequest.swf?onload=setupSWFXHR" />
    3         <param name="allowScriptAccess" value="always" />
    4         <embed class="hidden" src="swfhttprequest.swf?onload=setupSWFXHR" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
    5        </embed>
    6 </object>


       在你要跨域的地方引入这段代码,里面的第一个param的value的值和embed的src是需要改变的,格式为:flash文件?onload=跨域的方法; 

       例如以上我的flash文件是swfhttprequest.swf是我的flash文件,setupSWFXHR是我的跨域方法如下面代码所示:

     1 window.setupSWFXHR = function() {
     2         var shr = new SWFHttpRequest();
     3         shr.open('GET', 'http://imgup.b2b.hc360.com/search_mark/mark/');
     4         shr.onreadystatechange = function() {
     5             if (this.readyState != 4) return;
     6             if (this.status == 200) {
     7                 // Success! Take appropriate action with this.responseText
     8             } else {
     9                 // Oops - something went wrong
    10             }
    11         };
    12         shr.send('some=post&data=here');
    13     }

    shr.open里面的第二个参数是要跨域的地址;这个方法是支持post和get跨域的。




  • 相关阅读:
    线程客户端Socket多客户端编程实例
    型文法文法文法的类型
    数据网络一键完成数据网络备份与恢复
    nullnullvc中加花
    sql文件Pro*C编程研究一:从.pc到.exe
    绑定函数【OpenGL】关于OpenGL中Bind函数的理解
    包删除Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
    开源企业开源力量公开课第20期“拥抱开源,企业IT自主之路”
    剑侠情缘状态hdu 4558 剑侠情缘(dp, 西山居复赛1第2题)
    硬件问题关于创业
  • 原文地址:https://www.cnblogs.com/module/p/5213995.html
Copyright © 2011-2022 走看看