最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下
很庆幸,我又见到了末日后新升的太阳,所以我还能在这里写文章,言归正传哈,最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家。

什么是JSONP协议?

JSONP即JSON with
Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

很明显,JSONP是一种脚本注入(Script Injection)行为,需要特别注意其安全性。

Jquery中的jsonp实例
我们需要两个页面,分别承担协议的客户端和服务器端角色。

客户端代码

复制代码
代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
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)

复制代码
代码如下:
<?php
$jsonp =
$_REQUEST["callback"];
$str =
'[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]';
$str = $jsonp . "("
.$str.")";
echo $str;
?>

 
Jsonp的原理和简单实例

jquery是对其进行了封装,你可能看不到真正的实现方法,我们用下面的一个例子进行说明:
客户端代码:

复制代码
代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
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>

服务端代码

复制代码
代码如下:
<?php
$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个字

签名:共同交流,共同学习,帮助需要帮助的人,共同走向成功之路。

js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)的更多相关文章

  1. .NET中Ajax跨越访问

    说明:我们知道Ajax是不能进行跨域请求的,我们是可以设置我们的项目让Ajax支持跨域访问. 跨域: aa.xxx.com 中用ajax请求  bb.ccc.com中的数据成为跨域. 找了一些文章看了 ...

  2. JSONP的原理与实现(基于jQuery)

    为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP. 这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大.这 ...

  3. 解决js ajax跨越请求 Access control allow origin 异常

    // 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*");

  4. js ajax post 提交的时候后台接收不到参数,但是代码没有错,怎么回事

    这个错误有两点,你自己写的php页面里面的参数接收出错了 还有就是你没有写一句重要的代码告诉浏览器 你使用post提交方式去提交 xhr.setRequestHeader("Content- ...

  5. 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 ...

  6. jQuery的ajax跨域 Jsonp原理

    1.Jsonp Jsonp(json with padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. Jsonp是为了解决ajax跨域发送http请求出现的,利用S ...

  7. JS Ajax跨域访问

    js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...

  8. JS+Ajax+Servlet:记录页面访问时间

    1.前端JS记录页面访问时间 1.1JQuery版本: <script type="text/javascript" src="js/jquery.min.js&q ...

  9. Ajax跨越请求失败,解决

    跨越请求 1.1什么是跨域(两个不同系统之间的访问.调用) (1)域名不同,即两个不同的应用. (2)域名相同,但是端口不同,即同一个应用中的不同子系统. 1.2 Ajax跨域请求的缺陷 (1)创建t ...

随机推荐

  1. kill -9 和kill

    kill pid 在kill进程的同时,会将包删掉该进程所在webapps目录下的文件夹,如iexpense文件夹 kill -9 pid 会强制删掉进程,但是不是删掉该进程所在webapps目录下的 ...

  2. AcmeAir

    AcmeAir是一款由原 IBM 新技术架构部资深工程师Andrew Spyker,利用Netflix开源的Netflix OSS打造的开源电子商务应用.访问这里可以了解原作者的设计初衷: http: ...

  3. Linux软链接和硬链接

    Linux中的链接有两种方式,软链接和硬链接.本文试图清晰彻底的解释Linux中软链接和硬链接文件的区别. 1.Linux链接文件 1)软链接文件  软链接又叫符号链接,这个文件包含了另一个文件的路径 ...

  4. docker基本概念,创建、起动实例,保存自定义镜像等常用操作

    14年docker火了一阵,当时自学整理了一份文档,后来冷落了. 现在发现很多同事还是想学习docker,但无从下手,所以重新整理了这篇分享,10分钟就可以带你彻底理解docker,并能够创建属于自己 ...

  5. 最短JS判断是否为IE6(IE的写法) (转)

    常用的 JavaScript 检测浏览器为 IE 是哪个版本的代码,包括是否是最人极端厌恶的 ie6 识别与检测. 代码如下: var isIE = !!window.ActiveXObject; v ...

  6. svn服务器及客户端安装使用

    一.服务器安装: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输入 ...

  7. Android端通过HttpURLConnection上传文件到服务器

    Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...

  8. [分享] VIM 常用命令及游戏练级

    分享一个不错的文章,讲解了 VIM 的常用命令. http://coolshell.cn/articles/5426.html 另,介绍一个可以帮助熟悉VIM命令的练级游戏. 游戏地址:http:// ...

  9. vm上安装ubuntu

    图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像文 ...

  10. [转]微软联合CSDN英雄在线编程大赛

    2014 新年将至,微软联合CSDN英雄会共同举办本次第三届在线编程大赛,题目详情如下: 有一个字符串"iinbinbing",截取不同位置的字符‘b’.‘i’.‘n’.‘g’组合 ...