JSONP

1.1 什么是同源政策?


1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。


  • 协议相同
  • 域名相同
  • 端口相同

举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下。


  • http://www.example.com/dir2/other.html:同源
  • http://example.com/dir/other.html:不同源(域名不同)
  • http://v2.www.example.com/dir/other.html:不同源(域名不同)
  • http://www.example.com:81/dir/other.html:不同源(端口不同)

1.2 同源策略诞生的目的?

        同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

1.3 同源策略的限制范围

随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。


  • Cookie、LocalStorage 和 IndexDB 无法读取。
  • DOM 无法获得。
  • AJAX 请求不能发送。

虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。下面,我将详细介绍,如何规避上面三种限制。


什么是JSONP?

JSONP 英文全程(Json With Padding,JSONP 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。因为同源策略我们从不同的域(网站)访问数据有一个特殊的技术( JSONP )。JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。它的基本思想是,网页通过添加一个


下面是客户端js代码

function addScriptTag(src) {
   //创建一个script标签
  var script = document.createElement('script');
  //设置script标签的type属性为text/jacascript 告诉浏览器这是一个JavaScript脚本
  script.setAttribute("type","text/javascript");
  //设置script的src属性 设置src属性之后浏览器将到指定服务器异步下载脚本
  script.src = src;
  //将新创建的script标签插入文档尾部
  document.body.appendChild(script);
 }

window.onload = function () {
   //query参数后面的callback函数名必须要一个已存在的函数名
  addScriptTag('http://example.com/ip?callback=foo');
 }

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

上面代码通过动态添加


下面是服务器端PHP代码

header('Content-type: application/json');
//获取回调函数名 这个js函数名字由客户端的请求参数决定?callback=foo
$jsoncallback = htmlspecialchars($_REQUEST ['callback']);
//生成一个json数据
$json_data = '["ip","8.8.8.8"]'; 
//输出jsonp格式的数据 
echo $jsoncallback . "(" . $json_data . ")"; 
//相当于动态创建的script标签的src属性请求了一个js文件 但是js文件的内容只有foo({ip:"8.8.8.8"});这一段调用代码
/**
  *  <script src="xxx.js"></script>
  *
  * //xxx.js内容
  * foo({
  *     "ip":"8.8.8.8"
  *  });
  */

由于


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值