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




  • 相关阅读:
    前端微服务
    日志系统的设计
    js解决数据精度问题
    前端取不到header 里面的内容问题
    sql server 数据库查询 json 数据乱码
    IDEA 根据 DCEVM + Hotswap Agent 实现项目热部署
    Redis 常用命令
    Spring Data JPA native query 分页
    十八年开发经验分享(06)递归程序构造
    十八年开发经验分享(07)递归程序设计
  • 原文地址:https://www.cnblogs.com/module/p/5213995.html
Copyright © 2011-2022 走看看