JSONP&跨域

2017-10-10  本文已影响0人  D一梦三四年

1. 什么是同源策略

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

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

3. JSONP 的原理是什么?

4. CORS是什么?

5. 跨域的解决方式

JSONP:利用<script>标签没有跨域限制来达到与第三方通讯的目的。

  1. 创建 index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Messages</title>
</head>
<body>
    <ul class="messages"></ul>

<script>
    var script = document.createElement('script');
    script.src = 'http://localhost:8080/getMessages?name=小明&callback=searchMessage';
    document.head.appendChild(script);
    document.head.removeChild(script);

    function searchMessage(person) {
        var html = '';
        for (var i = 0; i < person.length; i++) {
            html += '<li>' + person[i] + '</li>';
        }
        console.log(html);
        $('.messages').innerHTML = html;
    }

    function $(id) {
        return document.querySelector(id);
    }
</script>
</html>
  1. 创建 router.js
router.get('/getMessages', function (req, res) {
    var name = req.query.name;
    var messages = [];
    if (name === '小明') {
        messages.push("name: 小明", "age: 23")
    } else if (name === '小李') {
        messages.push("name: 小李", "age: 20")
    } else {
        return;
    }

    var cb = req.query.callback;
    if (cb) {
        res.send(cb + '(' + JSON.stringify(messages) + ')');
    } else {
        res.send(messages);
    }
})
  1. 打开本地服务器


    本地服务器.png
  2. 打开另外一个端口


    JSONP.png

CORS:在HTTP请求里添加特殊的头,允许服务器指定特定的域名可以跨域访问。

  1. 创建 index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Messages</title>
</head>
<body>
<button class="btn">获取信息</button>
<p class="messages"></p>
<script>
    var btn = document.querySelector('.btn');
    var messages = document.querySelector('.messages');
    btn.addEventListener('click', function () {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if (xhr.status === 200 || xhr.status === 304) {
                    var results = JSON.parse(xhr.responseText);
                    messages.innerText += '姓名:' + results.name;
                }
            }
        }
        xhr.open('GET', 'http://localhost:8080/getMessages?name=小明', true);
        xhr.send();
    })
</script>
</html>
  1. 创建 router.js
router.get('/getMessages', function (req, res) {
    res.header('Access-Control-Allow-Origin', '*');
    var name = req.query.name;
    var data = {};
    if (name === '小明') {
        data = {name: "小明"}
    } else if (name === '小李') {
        data = {name: "小李"}
    } else {
        return;
    }
    res.send(data);
})
  1. 打开本地服务器


    本地服务器.png
  2. 打开另外一个端口
CORS.png

postMessage:允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。

  1. 创建 index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>A</title>
</head>
<body>
<input id="inta" type="text" placeholder="aaa">
<p>我是A窗口</p>
<iframe src="http://192.168.0.248:8080/xxx.html" width="300px" height="200px" style="border: 1px dotted"></iframe>
<script type="text/javascript">
    var btna = document.getElementById('inta')
    btna.oninput = function(){
        window.frames[0].postMessage(this.value,'*')
    }
    window.addEventListener('message',function(e){
        btna.value.e.data
    })
</script>
</body>
</html>
  1. 创建 xxx.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>B</title>
</head>
<body>
<input id="intb" type="text" placeholder="bbb">
<p>我是B窗口</p>
<script type="text/javascript">
    var btnb = document.getElementById('intb')
    btnb.oninput = function(){
        window.parent.postMessage(this.value,'*')
    }
    window.addEventListener('message',function(e){
        btnb.value=e.data
    })
</script>
</body>
</html>
  1. 打开另外一个端口


    http-server.png
  2. 本地服务器


    postMessage.png
上一篇 下一篇

猜你喜欢

热点阅读