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跨域的。




  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/module/p/5213995.html
Copyright © 2011-2022 走看看