美文网首页
降域——针对iframe实现跨域的方式

降域——针对iframe实现跨域的方式

作者: Bluesbone | 来源:发表于2017-11-02 01:42 被阅读0次

    关于iframe的同源策略问题

    在当前页面下的iframe的域名若与当前页面的域名不同源,则当前页面的js代码对iframe无法进行任何操作。
    这是为了保护用户在iframe中登录其他网站或与之类似的相关操作会泄露隐私数据。


    什么是降域

    http://a.justfun.mehttp://b.justfun.me,后面的justfun.me相同,那么就可以使用document.domain将二者的域名设置为justfun.me,来实现同源

    注意事项

    • 顶级域名无法降域
    • 不仅当前页面要使用document.domain,iframe的源页面也要使用document.domain

    与JSONP、CORS相比

    • 降域主要针对于当前页面下的iframe

    实现代码

    注意修改host文件使得不同域名映射至同一个IP地址,即可测试JSONP跨域


    主页面代码

    <!doctype html>
    <html lang="ch">
    <head>
        <meta charset="utf-8">
        <title>使用降域</title>
        <style>
            .container {
                display: flex;
            }
    
            .container .main, iframe {
                border: 1px solid;
                height: 300px;
                width: 30%;
            }
    
            .main input {
                width: 300px;
            }
        </style>
    </head>
    <body>
    <h1>降域</h1>
    <div class="container">
        <div class="main">
            <input type="text">
        </div>
        <iframe src="http://b.justfun.me:8080/iframe.html" frameborder="0"></iframe>
    </div>
    <script>
        var inputNode = document.querySelector('.container .main input')
        inputNode.setAttribute('placeholder', '我是当前网页,我的域名是' + location.origin)
    
        // console.log(window.frames[0].document.body) // 执行这行代码会报错,因为当前网页获取不到任何有关iframe的信息
    
        document.domain = 'justfun.me'
        // 注意:顶级域名无法进行降域
    
    </script>
    </body>
    </html>
    

    iframe页面代码

    <!doctype html>
    <html lang="ch">
    <head>
        <meta charset="utf-8">
        <title>使用降域</title>
        <style>
            .main input {
                width: 300px;
            }
        </style>
    </head>
    <body>
    <div class="container">
        <div class="main">
            <input type="text">
        </div>
    </div>
    <script>
        var inputNode = document.querySelector('.container .main input')
        inputNode.setAttribute('placeholder', '我是iframe,我的域名是' + location.origin)
    
        document.domain = 'justfun.me'
    
    </script>
    </body>
    </html>
    

    代码GitHub地址

    参考资料:顶级域名

    前端

    相关文章

      网友评论

          本文标题:降域——针对iframe实现跨域的方式

          本文链接:https://www.haomeiwen.com/subject/adgnpxtx.html