js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
什么是JSONP协议?
JSONP即JSON with
Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。
很明显,JSONP是一种脚本注入(Script Injection)行为,需要特别注意其安全性。
Jquery中的jsonp实例
我们需要两个页面,分别承担协议的客户端和服务器端角色。
客户端代码:
代码如下:
1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>jsonp测试例子</title>
<script type="text/javascript"
src="http://www.xxxxxxxxxxxx.cn/js/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
$.ajax({
type: "get",
async: false,
url:
"http://www.xxxxxxxxxxxx.cn/demos/jsonp.php",
dataType: "jsonp",
jsonp:
"callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:"feedBackState",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success: function(data){
var $ul = $("<ul></ul>");
$.each(data,function(i,v){
$("<li/>").text(v["id"] + " " +
v["name"]).appendTo($ul)
});
$("#remote").append($ul);
},
error:
function(){
alert('fail');
}
});
});
</script>
</head>
<body>
远程数据如下:<br/>
<div
id="remote"></div>
</body>
</html>
服务端代码(本例采用PHP):
代码如下:
$jsonp =
$_REQUEST["callback"];
$str =
'[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]';
$str = $jsonp . "("
.$str.")";
echo $str;
?>
Jsonp的原理和简单实例
jquery是对其进行了封装,你可能看不到真正的实现方法,我们用下面的一个例子进行说明:
客户端代码:
代码如下:
1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" />
<head>
<title>jsonp测试例子</title>
<script type="text/javascript"
src="http://www.xxxxxxxxxxxx.cn/js/jquery.min.js"></script>
<script type="text/javascript">
function CallJSONPServer(url){ //
调用JSONP服务器,url为请求服务器地址
var oldScript =document.getElementById(url); //
如果页面中注册了调用的服务器,则重新调用
if(oldScript){
oldScript.setAttribute("src",url);
return;
}
var script =document.createElement("script"); //
如果未注册该服务器,则注册并请求之
script.setAttribute("type", "text/javascript");
script.setAttribute("src",url);
script.setAttribute("id", url);
document.body.appendChild(script);
}
function
OnJSONPServerResponse(data){
var $ul = $("<ul></ul>");
$.each(data,function(i,v){
$("<li/>").text(v["id"] + " " +
v["name"]).appendTo($ul)
});
$("#remote").append($ul);
}
</script>
</head>
<body>
<input
type="button" value="点击获取远程数据"
onclick="CallJSONPServer('http://www.xxxxxxxxxxxx.cn/demos/jsonp_original.php')"
/>
<div id="remote"></div>
</body>
</html>
服务端代码:
代码如下:
$str =
'[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]';
$str =
"OnJSONPServerResponse(" .$str.")";
echo $str;
?>
别的不多说,相信看代码大家应该明白它是怎么实现的了。
需要注意:
1.由于 jquery 在ajax
处理中使用的是utf-8编码传递参数的,所以jsonp处理端用utf-8的编码最好,这样省得编码转换了,如果不是utf-8记得转换,否则中文会乱码。
2.请求的服务端url最好不要写成http://www.xxxxxxxxxxxx.cn/?act=add这样的,应写全其为:http://www.xxxxxxxxxxxx.cn/index.php?act=add这样的,在应用的过程中出现了不兼容的情况。
到此就ok了,如有朋友碰到什么问题可发上来大家共同交流。
欢迎大家转载,转载请注明原创 包括链接一定要加上,否则...此处略去n个字
签名:共同交流,共同学习,帮助需要帮助的人,共同走向成功之路。
您可能感兴趣的文章:
- javascript:json数据的页面绑定示例代码
- JavaScript Ajax Json实现上下级下拉框联动效果实例代码
- javascript打印输出json实例
- java与javascript之间json格式数据互转介绍
- 将json当数据库一样操作的javascript lib
- javascript仿php的print_r函数输出json数据
- javaScript 动态访问JSon元素示例代码
- JavaScript中json使用自己总结
- JSON+JavaScript处理JSON的简单例子
- JavaScript中json对象和string对象之间相互转化
- javascript操作JSON的要领总结
- javascript生成json数据简单示例分享
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)的更多相关文章
- .NET中Ajax跨越访问
说明:我们知道Ajax是不能进行跨域请求的,我们是可以设置我们的项目让Ajax支持跨域访问. 跨域: aa.xxx.com 中用ajax请求 bb.ccc.com中的数据成为跨域. 找了一些文章看了 ...
- JSONP的原理与实现(基于jQuery)
为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP. 这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大.这 ...
- 解决js ajax跨越请求 Access control allow origin 异常
// 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*");
- js ajax post 提交的时候后台接收不到参数,但是代码没有错,怎么回事
这个错误有两点,你自己写的php页面里面的参数接收出错了 还有就是你没有写一句重要的代码告诉浏览器 你使用post提交方式去提交 xhr.setRequestHeader("Content- ...
- Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)
Ajax跨域问题及解决方案 目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...
- jQuery的ajax跨域 Jsonp原理
1.Jsonp Jsonp(json with padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. Jsonp是为了解决ajax跨域发送http请求出现的,利用S ...
- JS Ajax跨域访问
js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...
- JS+Ajax+Servlet:记录页面访问时间
1.前端JS记录页面访问时间 1.1JQuery版本: <script type="text/javascript" src="js/jquery.min.js&q ...
- Ajax跨越请求失败,解决
跨越请求 1.1什么是跨域(两个不同系统之间的访问.调用) (1)域名不同,即两个不同的应用. (2)域名相同,但是端口不同,即同一个应用中的不同子系统. 1.2 Ajax跨域请求的缺陷 (1)创建t ...
随机推荐
- 测试in和or的执行时间
declare @d datetime set @d=getdate() /*你的SQL脚本开始*/ SELECT * FROM T_KNOWLEDGE WHERE KNOWLEDGE_TYPE_OI ...
- Struts2.0 去掉action后缀名
刚刚接触Struts2.0,发现默认请求都会带着后缀名:action 就如下图,url地址中会暴露login.action(请原谅struts拼写错误..) 作为一个URL简洁爱(chu)好(nv)者 ...
- iOS 证书调试的理解(Personal)
证书签名 证书:众所周知,我们申请一个Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存 ...
- openfire插件开发入门1
.案例插件的功能 这个插件很简单,就是在openfire Server启动时,和关闭时,在控制台打印出消息. 3.插件开发的目录结构设计 先来看一下当前openfire在eclipse中的目录结构: ...
- USACO Section 2.4: The Tamworth Two
这题我是用蒙的方法来弄出最后的不能碰到的条件的(用1000试了下account跳出条件),结果竟然还过了,不过网上有精准的求出这个碰不到的条件,farm的状态为10*10*4 = 400,cow的状态 ...
- Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)
然后是项目下的文件:完整的项目请看 上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...
- [原]POJ-1631-Bridging signals-( 水LIS-O(nlogn) -DP)
题目大意:求最长上升子序列(LIS)长度,序列最大数不超过40000.因为只有上升排列的接口才不相交. 思路:普通的 O(n^2)的做法肯定会超时:因此,dp[ ] 记录长度为 i+1 的子序列中最末 ...
- Gumshoe - Microsoft Code Coverage Test Toolset
Gumshoe - Microsoft Code Coverage Test Toolset 2014-07-17 What is Gumshoe? How to instrument a binar ...
- 不同tomcat配置不同的jdk
修改Tomcat两个配置文件,tomcat/bin/catalina.sh . tomcat/bin/setclasspath.sh . 在catalina.sh文件和setclasspath.sh文 ...
- 多线程安全的HTTPCLIENT
private static HttpClient httpClient; static { HttpParams params = new BasicHttpParams ...