jsonp

参考:轻松搞定JSONP跨域请求
参考:JavaScript 跨域总结与解决办法
要理解跨域,先要了解一下“同源策略”。

所谓同源是指,域名协议端口相同。
简单的说就是基于安全考虑,当前域不能访问其他域的东西。


什么是跨域

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。

网上一张列举跨域的详细清单:

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lib/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8080/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
同一域名,不同二级域名
(同上)
不允许
(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

有两点要特别注意:

  • 如果是协议端口造成的跨域问题“前台”是无能为力的
  • 在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。
  • “URL的首部”指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。

拿豆瓣的api简单尝试一下跨域请求出现的问题。

    window.onload = function(){
        var oBtn = document.getElementById('btn');

        oBtn.onclick = function(){
            var xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4 && xhr.status == 200){
                    console.log(xhr.responseText);
                }
            }
            // No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
            xhr.open('get','https://api.douban.com/v2/book/search?q=javascript&count=1',true);
            xhr.send();
        }
    }

浏览器会报出上面的错误 ,请求资源上不存在“访问控制允许源”标头。

JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写

我们知道,的src(获取图片),的href(获取css),

你可能感兴趣的:(jsonp)