• 跨域2-常用的跨域方式



    1.主域相同的跨域
    document.domain的场景只适用于不同子域的框架间的交互,及主域必须相同的不同源。


    /2.*************JSONP start***********************/

    JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。

    它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。

    首先,网页动态插入<script>元素,由它向跨源网址发出请求。

    function addScriptTag(src) {
    var script = document.createElement('script');
    script.setAttribute("type","text/javascript");
    script.src = src;
    document.body.appendChild(script);
    }

    window.onload = function () {
    addScriptTag('http://example.com/ip?callback=foo');
    }

    function foo(data) {
    console.log('Your public IP address is: ' + data.ip);
    };


    上面代码通过动态添加<script>元素,向服务器example.com发出请求。注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的。

    服务器收到这个请求以后,会将数据放在回调函数的参数位置返回。


    foo({
    "ip": "8.8.8.8"
    });
    由于<script>元素请求的脚本,直接作为代码运行。

    /*************JSONP end***********************/

    3.indow对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的。window.name属性的神奇之处在于name 值在不同的页面(甚至不同域名)加载后依旧存在(如果没修改则值不会变化),并且可以支持非常长的 name 值(2MB)。

    window.name = data;//父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入。
    location = 'http://parent.url.com/xxx.html';//接着,子窗口跳回一个与主窗口同域的网址。
    var data = document.getElementById('myFrame').contentWindow.name。//然后,主窗口就可以读取子窗口的window.name了。
    如果是与iframe通信的场景就需要把iframe的src设置成当前域的一个页面地址。

    4.通过window.postMessage跨域
    postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即"协议 + 域名 + 端口"。也可以设为*,表示不限制域名,向所有窗口发送。

    父窗口和子窗口都可以通过message事件,监听对方的消息。message事件的事件对象event,提供以下三个属性:

    1、event.source:发送消息的窗口。
    2、event.origin: 消息发向的网址。
    3、event.data:消息内容。

    5、通过WebSocket跨域
    WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。


    参考:
    https://github.com/wengjq/Blog/issues/2

  • 相关阅读:
    Trying to reload asset from disk that is not stored on disk
    学习,再学习!
    关于webQQ3.0
    java 之 枚举
    部队的日子
    大兵
    关于webQQ3
    Ubuntu下gedit的java编译设置
    晒晒
    chrome中行网银插件(Linux下可用,可以淘宝支付宝)
  • 原文地址:https://www.cnblogs.com/bg57/p/8563232.html
Copyright © 2020-2023  润新知