关于json-p

目录

json-p是什么

json-p实际上是一种跨域ajax发送http请求的方法,它不是什么全新的技术,而是巧妙的利用,组合目前的技术而实现跨域通讯的方法。我们知道浏览器由于安全考虑,在编写ajax程序时,httprequest/xmlhttp都不能发送非本域的http请求,类似下面的代码

<!--www.a.com/test.aspx页面里的内容 -->

<script>

 ajax.request("http://www.b.com/ajaxserver.aspx",function(){});

</script>

都不会得到你想要的结果,由于您的网页域名是www.a.com,而您发送的ajax请求的目标域却是www.b.com。浏览器会阻止这一的请求,这就是所谓的同源策略。而json-p就是解决这一问题的其中一种方式。

json-p原理分析

假如我们有一个网页www.a.com/index.aspx 其中一段代码如下:

<scriptsrc="http://www.b.com/test.js"><script>

test.js里面的代码:

alert("我是属于域www.b.com的");

显然这佯做毫无问题,我们打开www.a.com/index.aspx的时候,会弹出一个框(我是属于www.b.com的)。

现在我们将www.a.com/index.aspx里面的代码改成这样

<script>
function test(str){
alert(str);
}
window.onload=function(){var script=document.createElement("script");
script.src="http://www.b.com/test.js";
document.getElementByTagName("head")[0].appendChild(script);
}
</script>

www.b.com/test.js里面的内容改成:

test("我是www.b.com/test.js里面的参数哦");

如果不意外的话,浏览器加载完依然会弹出一个对话框(我是www.a.com里面的函数)。 这2个例子清晰的表明,对于js脚本, 浏览器并没有同源的限制,www.a.com能够直接使用www.b.com的javascript资源,并且支持我们通过编写javascript脚本,动态的创建script标签,动态加载。那么我们能否利用浏览器对于script没有同源限制的这一特性,来实现我们的跨域通信呢,答案是肯定的,jsonp实质上就是利用了这一点。现在假设www.a.com/index.aspx 有个用户登陆了, 我们需要在index.aspx页面要将这一信息发送给www.b.com/login.aspx。index.aspx我们可以编写如下面的代码

function callback(ret){
alert(ret);
}
var script=document.createElement("script");
script.src="http://www.b.com/login.aspx"+"?name="+youname+"&pwd="+pwd+"&call=callback";
document.getElementByTagName("head")[0].appendChild(script);

在www.b.com/login.aspx页面编写如下代码

Response.Header.Append("Content-Type","application/javascript");
var name=Request.QueryString["name"];
var pwd=Request.QueryString["pwd"];
var call=Request.QueryString["call"]
if(SystemService.Login(name,pwd)){
  Response.Write(call+"('login success!')");}else{Response.Write(call+"('name or pwd error!')");
}
Response.End();

大家如果能看懂上面的代码吗? 对, 这就是所谓的jsonp。

json-p的缺点

  1. 目标域的服务器必须要如你所愿的输出一些你想要的脚本才可以。如上面www.b.com/login.aspx页面输出的callback ,想象一下,假如www.b.com/login.aspx输出的并非callback;而是输出alert("你妹的,你妹的"),那会是一种什么情况....说白了, 目标域,如果不受你控制,又不支持这样方式,那么你是无法使用json-p这种方式的。
  2. 只能是get请求

关于json-p的更多相关文章

  1. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

  6. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  7. JSON.parse()和JSON.stringify()

    1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...

  8. json与JavaScript对象互换

    1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...

  9. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  10. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

随机推荐

  1. 在html中引用分享的链接

    怎么说呢,其实我自己本身也不是很懂,这些到网上一搜也是有很多详解的,我就是水水的来~~ 附带:smarty 的 tpl 里面 要直接写 javascript 或 style 要用 literal 标签 ...

  2. Life Cycle of Thread – Understanding Thread States in Java

    Life Cycle of Thread – Understanding Thread States in Java 深入理解java线程生命周期. Understanding Life Cycle ...

  3. jquery cdn/////////////////zzz

    jquery-2.1.1 注:jquery-2.0以上版本不再支持IE 6/7/8)百度引用地址 (推荐目前最稳定的,不会出现延时打不开情况) 百度压缩版引用地址:<script src=&qu ...

  4. Linux启用和配置Java

    Firefox 在安装 Java 平台时,Java 插件文件将作为该安装的一部分包含在内.要在 Firefox 中使用 Java,您需要从该发行版中的插件文件手动创建符号链接指向 Firefox 预期 ...

  5. iOS 开发:CoCoapods的使用和安装

    CocoaPods的使用和安装 一.什么是CocoaPods? 前言: 思考如何引入一个第三方框架. 例如: 百度地图SDK.友盟.ShareSDK. 信鸽推送等. 从github或某处下载第三方SD ...

  6. java 支付宝 第三方即时到账支付 接口

    alipay 的几个内核功能文件:=================================================================================== ...

  7. PHP基础班初学心得:JS里inner的一些理解

    本人刚参加PHP基础班培训,由于之前毫无基础,分享的心得可能不规范,方法也许也"旁门左道",不能保证质量,只作自己总结学习,也希望能帮助到同样是初学者的朋友们,共同进步. 在这里分 ...

  8. python之haproxy配置文件操作(第三天)

    作业: 对haproxy配置文件进行操作 要求: 对haproxy配置文件中backend下的server实现增删改查的功能 一.这个程序有二个版本 1. python2.7版本见haproxy_py ...

  9. 头疼:为什么chrome不能访问本地文件(带--disable-web-security --allow-file-access-from-files )

    如题,寻求帮助! chrome 带参数启动 --disable-web-security  --allow-file-access-from-files 照理应该可以加载本地文件,找遍google和英 ...

  10. select change下拉框改变事件 设置选定项,禁用select

    select change下拉框改变事件 设置选定项,禁用select 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...