Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 356|回复: 0

javascript 跨域问题解决办法总结

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-18 14:50:05 | 显示全部楼层 |阅读模式
    逼你退出

    跨域的意思就是不同域名之间的页面默认是无法通信的。因为浏览器默认是禁止跨域的;

     

     

    图所示:chrome浏览器尝试获取mainFrame失败,提示DomException

     

    image

     

    image

     

     

     

     

     

    1).假如你有个网站 a.com 中有个iframe的连接指向的是http://www.baidu.com,那么你想获取iframe中元素id为text1的值,通过js是无法获取到的。

       办法: location.hash ,ifame  

     

    2).再换一种情况。 a.a.com 中有个iframe的src指向的是b.a.com,同家族a.com下的不同2级域名,在a.a.com中使用js也是无法获取到b.a.com中的内容。

       办法:document.domain+iframe

     

     

     

    下面是常用的解决跨域的办法

     

     

     

    1..document.domain+iframe 的设置

    适用同一家族下的2个子域名  a.a.com   ,b.a.com  以及a.com ,script.a.com

    domain必须设置为a.com,及等于window.location.hostname

     

    a.a.com 想引用 b.a.com html代码中的值

    可以在 a.a.com 和b.a.com下面都加上伪域名   a.com,接着在a.a.com中动态创建iframe

    1)在b.b.com中加入

    <script type=”text/javascript” >

    document.domain = "a.com";

    </script>

     

    2)接着在a.a.com中加入script 代码,通过 iframe的contextDocument获取b.a.com中的值

    <script type=”text/javascript” >

    document.domain = 'a.com';
    var ifr = document.createElement('iframe');
    ifr.src = 'http://script.a.com/b.html';
    ifr.style.display = 'none';
    document.body.appendChild(ifr);
    ifr.onload = function(){
        var doc = ifr.contentDocument || ifr.contentWindow.document;
        // 在这里操纵b.html
        alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
    };

    </script>

    a.a.com通过下面代码获取b.a.com窗口的高度

    var h = window.navigator.userAgent.indexOf("MSIE") > 0 ? document.body.scrollHeight : document.documentElement.scrollHeight;
    parent.parent.document.getElementById('name').height = h;

     

     

    两个不同的子域名伪装成了同域,完全在同源策略的保护下进行通信

     

     

    2. location.hash ,ifame          (弊端:远端的数据页面,你要协调好,必须得放一段js)       

    可以解决不同主域名下的数据通信,但是hash有长度限制,数据暴露,数据类型有限制

    子窗口无法改变无窗口的hash值,除非是同一域名下的

     

    www.baidu.com#abc  就是location.hash

     

    假如a.com要使用b.com中的值。

    1)首先a.com创建iframe,并指向 b.com#parms

     

    a.com用js定时检测iframe中src中的location.hash是否改变了,如果改变则获取其值则获取新location.hash值。

    IE,chrome浏览器不支持跨域修改parent.location.hash值,所以需要代理。但是firefox支持修改。

     

    a.com中的代码

    <script>

    function startRequest(){
        var ifr = document.createElement('iframe');
        ifr.style.display = 'none';
        ifr.src = 'http://www.cnblogs.com/lab/cscript/cs2.html#paramdo';   //根据paramdo来决定获取啥值
        document.body.appendChild(ifr);
    }

    //每2秒检测一次,是否变动了值
    function checkHash() {
        try {
            var data = location.hash ? location.hash.substring(1) : '';
            if (console.log) //console.log javascript中调试输出信息,比alert好

              {
                console.log('Now the data is '+data);
            }
        } catch(e) {};
    }
    setInterval(checkHash, 2000);

    </script>

     

     

    b.com页面的代码如下

    //模拟一个简单的参数处理操作
    switch(location.hash){
        case '#paramdo':
            callBack();
            break;
        case '#paramset':
            //do something……
            break;
    }
    //设置a.com iframe src的location.hash
    function callBack(){
        try {
    //此时是火狐正常执行
            parent.location.hash = 'somedata';
        } catch (e) {
            // iechrome的安全机制无法修改parent.location.hash,
            // 所以要利用一个中间的cnblogs域下的代理iframe
            var ifrproxy = document.createElement('iframe');
            ifrproxy.style.display = 'none';
            ifrproxy.src = 'http://a.com/test/cscript/cs3.html#somedata';    // 注意该文件在"a.com"域下
            document.body.appendChild(ifrproxy);
        }
    }
     
     
    a.com域名下 cs3.html中的代码
     
    //因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
    parent.parent.location.hash = self.location.hash.substring(1);

     

    3. window.name  + ifame          (弊端:远端的数据页面,你要协调好,必须得放一段js)    

      http://www.cnblogs.com/StudyLife/p/3515357.html

     

    总结:

    location.hash 在 主页面a.com中设置'http://www.cnblogs.com/lab/cscript/cs2.html#paramdo'  (#paramdo为location.hash,不会随页面刷新改变)。并在a.com页面js每隔一段时间就去检测#paramdo是否被改变了,如果被改变了,说明获取到数据了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-3 07:17 , Processed in 0.062233 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表