使用jsonp跨域发送请求
如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。
使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。
服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。
如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。
注意,JSONP是JSON格式的扩展。他要求一些服务器端的代码来检测并处理查询字符串参数。
如果指定了script或者jsonp类型,那么当从服务器接收到数据时,实际上是用了<script>标签而不是XMLHttpRequest对象。
这种情况下,$.ajax()不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如beforeSend。
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。
JSONP的实现思路
- 前端创建script标记,设置src,添加到head中(你可以往body中添加)
- 后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据
- 回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<script src="js/jquery.min.js"></script>
<script>
function SaveData() {
var UserName = "星辰雾海";
$.ajax({
type: "post",
url: "http://116.228.89.136:8032/test.aspx",
dataType: "jsonp",
//这两句指定回调函数为:CallBackUser
jsonp: 'callback',
jsonpCallback: 'CallBackUser',
data: { UserName: UserName },
success: function (data) {
//jsonp请求,不会执行此函数,只执行CallBackUser
alert(data.UserName);
}
});
}
function CallBackUser(jsonData) {
alert(jsonData.UserName);
}
</script>
</head>
<body>
<input type="button" id="btnAdd" value="Test" onclick="SaveData()" />
</body>
</html>
请求Url:
http://116.228.89.136:8032/test.aspx?callback=CallBackUser&UserName=%E6%98%9F%E8%BE%B0%E9%9B%BE%E6%B5%B7&_=1457492166376
这个地址是自动拼接而成,注意中间拼接的 jsonp 参数的值,是你本地页面中的函数名称,在data属性中设置。
服务端代码:
protected void Page_Load(object sender, EventArgs e)
{
//http://116.228.89.136:8032/test.aspx?callback=jQuery11130304913979023695_1457491748431&jsonp=CallBackUser&UserName=%E6%98%9F%E8%BE%B0%E9%9B%BE%E6%B5%B7&_=1457491748433
string json = "{UserName:\"My nam is "+Request["UserName"]+"!\"}"; string callback = Request["callback"];
Response.Write(callback + "(" + json + ")");
Response.End();
}
输出脚本,自动执行。
附:跨域请求的方式有很多种,
- iframe
- document.domain
- window.name
- script
- XDomainRequest (IE8+)
- XMLHTTPRequest (Firefox3.5+)
- postMessage (HTML5)
- 后台代理
- ServiceStack
- 等等...
参考:http://www.cnblogs.com/know/archive/2011/10/09/2204005.html
使用jsonp跨域发送请求的更多相关文章
- php跨域发送请求原理以及同步异步问题
<script async type="text/javascript" src="http://lisi.com/data.php?flag=1"> ...
- 原生JS封装Ajax插件(同域&&jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
- jsonp 跨域请求
背景: JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源 ...
- jsonp 跨域原理详解
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...
- 【转】JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- JSONP跨域的原理解析(转)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...
- JSONP跨域的原理
一种脚本注入行为 在 2011年10月27日 那天写的 已经有 12671 次阅读了 感谢 参考或原文 服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...
- JSONP跨域的原理解析及其实现介绍
JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...
随机推荐
- Hadoop2.0产生背景
Hadoop与Hadoop生态系统的区别 Hadoop:是一个适合大数据分布式存储和分布式计算的平台,在Hadoop1.x中对应于HDFS和MapReduce: Hadoop生态系统:是一个很庞大的概 ...
- DRL前沿之:Benchmarking Deep Reinforcement Learning for Continuous Control
1 前言 Deep Reinforcement Learning可以说是当前深度学习领域最前沿的研究方向,研究的目标即让机器人具备决策及运动控制能力.话说人类创造的机器灵活性还远远低于某些低等生物,比 ...
- PHP写日志公共类
Txl_Log.php <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * * * ...
- nginx, supervisor
Nginx(单进程): 反向代理, 负载均衡.图解 将配置文件 nginx.conf 的 user xx 配置好 xx用户 检查语法 $ sudo service nginx configtest 重 ...
- openlayers3入门教程
...
- J2SE 8的集合
List ArrayList查询效率高LinkedList插入删除效率高 ArrayList ArrayList<String> arrayList = new ArrayList< ...
- 2 python第三章文件操作
1.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成立 els ...
- ABAP-关于隐式与显式的DB Commit
转载:https://www.cnblogs.com/liaojunbo/archive/2011/07/11/2103491.html 1.显式的DB Commit 显式的DB Commit并没有对 ...
- Asp.net MVC重要
1.asp.net mvc百度解释 2.asp.net mvc各版本特点 3.asp.net mvc知多少 4.asp.net mvc4入门到精通系列目录汇总(邹琼俊)[重要] 5.新年奉献MVC+E ...
- 傅里叶变换--MP3、JPEG和Siri背后的数学
http://blog.jobbole.com/51301/ 九年前,当我还坐在学校的物理数学课的课堂里时,我的老师为我们讲授了一种新方法,给我留下了深刻映像. 我认为,毫不夸张地说,这是对数学理论发 ...