美文网首页
JSONP_跨域

JSONP_跨域

作者: jamesXiao_ | 来源:发表于2017-06-20 15:09 被阅读0次

    什么是同源策略

    浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

    本域指的是?

    什么是跨域?跨域有几种实现形式

    • 跨域是指 不同域名之间相互访问 ,只要协议、域名、端口有任何一个不同,都被当作是不同的域
    1. jsonp
    2. 降域
    3. cors
    4. postMessage

    JSONP 的原理是什么

    • html中script标签可以引入其他域下的js,比如引入线上的jquery库。利用这个特性,可实现跨域访问接口。需要后端支持
    1. 定义数据处理函数_fun
    2. 创建script标签,src的地址执行后端接口,最后加个参数callback=_fun
    3. 服务端在收到请求后,解析参数,计算返还数据,输出 fun(data) 字符串。
    4. fun(data)会放到script标签做为js执行。此时会调用fun函数,将data做为参数。

    CORS是什么

    CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。 实现方式很简单,当你使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。所以 CORS 的表象是让你觉得它与同源的 ajax 请求没啥区别,代码完全一样。

    跨域的解决方式

    // JSONP方式
    // 页面请求
    btn.addEventListener('click', function(){
    var script = document.createElement('script');
    script.src = 'http://xxxx/getData?callback=appendChild'
    window.head.appendChild(script);
    window.head.removeChild(script);
    })
    function appendChild(data) {
    //JS对数据的操作
    }
    // 后端数据操作
    router.get('/getData', function(req, res) {
    var data = [];
    //一系列数据操作
    var cb = req.query.callback // 获取callback
    if (cb) {
    res.send(cb + '(' + JSON.stringify(data) + ')');
    }
    res.send(data)
    })

    // CORS方式
    // 页面上还是正常的数据请求,在返回数据的时候设置可以获取数据的域 代表所有
    res.header('Access-Control-Allow-Origin', '
    ');

    • JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
    • 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
    • JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。

    // 降域方式
    // 修改document.domain的方法只适用于不同子域
    <iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe>
    <script type="text/javascript">
    document.domain = 'example.com';//设置成主域
    function test(){
    alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
    }
    </script>
    // 子窗口
    <script type="text/javascript">
    document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
    </script>

    window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

    相关文章

      网友评论

          本文标题:JSONP_跨域

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