跨域(三)——JSONP

一、什么是JSONP?

百度百科:JSONP(JSON with Padding)是JSON的 一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

二、JSONP的实现思路很简单

1、前端创建script标记,设置src,添加到head中(当然也可以往body中添加)。

2, 后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据。

3, 回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)。

三、简单代码例子

服务器端:

<?php
$obj=array('chicken'=>2,'duck'=>3);//$ob是待传递对象
$callback=$_GET['callback'];//获取传入的函数名
if(!$callback){$callback='jsoncallback';//如果没传入就使用的默认函数名
}
//输出一段JS格式的代码,调用用传入的函数名,参数为需要传递的$obj对象
echo "alert('我是小偷,哈哈');".$callback.'('.json_encode($obj).');';
?>

客户端:

<div><span id="chicken"></span><br/><span id="duck"></span></div>
<script type="text/javascript">
//回调函数定义
function mycallback(obj){//输出传递过来的对象
  document.getElementById('chicken').innerHTML=obj.chicken;document.getElementById('duck').innerHTML=obj.duck;
};window.onload=function(){//创建SCRIPT标签var script=document.createElement("script");//设置URL
  script.src="http://127.0.0.1:8081//langtao/steal.php?callback=alert('我是强盗');mycallback";//把标签放入文档中以便生效
  document.body.appendChild(script);document.body.removeChild(script);
};
</script><!--<script>
$.ajax({
dataType:'jsonp',
data:'id=1',
jsonp:'callback',
url:'http://127.0.0.1:8081//langtao/steal.php',
success:function(obj){document.getElementById('chicken').innerHTML=obj.chicken;document.getElementById('duck').innerHTML=obj.duck;
},
});
</script>--><!--<script>
$.getJSON("http://127.0.0.1:8081//langtao/steal.php?callback=?",function(obj){document.getElementById('chicken').innerHTML=obj.chicken;document.getElementById('duck').innerHTML=obj.duck;}
);
</script>-->

 

四、安全问题

JSONP虽然易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

转载于:https://www.cnblogs.com/aaron-shu/p/4170304.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring DAO之JDBC

Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术&#xff0c; 如JDBC&#xff0c;Hibernate或者JDO等。它不仅可以让你方便地在这些持久化技术间切换&#xff0c; 而且让你在编码的时候不用考虑处理各种技术中特定的异常。为了便于以一种…

程序猿是如何解决SQLServer占CPU100%的

文章目录 遇到的问题使用SQLServer Profiler监控数据库 SQL1&#xff1a;查找最新的30条告警事件SQL2&#xff1a;获取当前的总报警记录数有哪些SQL语句会导致CPU过高&#xff1f;查看SQL的查询计划 选择top记录时&#xff0c;尽量为order子句的字段建立索引查看SQL语句CPU高的…

通过wifi调试Android程序

原文&#xff1a;http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 1.首先让android手机监听指定的端口&#xff1a;  这一步需要使用shell&#xff0c;因此手机上要有终端模拟器&#xff0c;不过网上很多&#xff0c;随便找个就行了&#xff0c…

基于jQuery的对象切换插件:soChange 1.5 (点击下载)

http://www.jsfoot.com/jquery/demo/2011-09-20/192.html 所有参数&#xff1a; $(obj).soChange({ thumbObj:null, //导航对象&#xff0c;默认为空 botPrev:null, //按钮上一个&#xff0c;默认为空 botNext:null, //按钮下一个。默认为空 thumbNowClass:no…

atitit.Oracle 9 10 11 12新特性attilax总结

atitit.Oracle 9 10 11 12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1. 审计简介 1 1.4. 其他&#xff08;大部分是管理功能&#xff09; 2 2. Oracle 12c 的 12 个新特性 2 2.1. 2 Improved Defaults 增强了DEFAULT, default目前可以直接指代…

mysql读书笔记---mysql safe update mode

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column 查看 mysql> show variables like %sql_safe%; 关闭 mysql> set sql_safe_updates0; 开启 mysql> set sql_safe_updates1;

基于纤程(Fiber)实现C++异步编程库(一):原理及示例

纤程&#xff08;Fiber&#xff09;和协程&#xff08;coroutine&#xff09;是差不多的概念&#xff0c;也叫做用户级线程或者轻线程之类的。Windows系统提供了一组API用户创建和使用纤程&#xff0c;本文中的库就是基于这组API实现的&#xff0c;所以无法跨平台使用&#xff…

MYSQL读书笔记---运算符、字符串操作

运算符###########################################,!(<>),>,>,<,< is null , is not null, isnull(expr) expr between min and max expr in(v1,v2,...)流程#############################################mysql> select ifnull(1,0); #如果第一个参数为…

fluidity详解

fluidity详解 1.fluidity编译过程 1.1.femtools库调用方法 编译fluidity/femtools目录下所有文件&#xff0c;打包为libfemtools.a静态库文件&#xff1b;通过-lfemtools参数&#xff0c;并指定libfemtools.a静态库位置&#xff0c;即可调用 femtools 库内所有函数2.fluidity主…

mysql读书笔记---if语句

IF(expr1,expr2,expr3) 如果expr1是TRUE(expr1<>0 and expr1<>NULL)&#xff0c;则IF()的返回值为expr2;否则返回值则为expr3。IF()的返回值为数字值或字符串值&#xff0c;具体情况视其所在语境而定。 mysql>SELECT?IF(1>2,2,3); ->3 mysql>SELECT I…

C语言 将整数写入内存指定的连续字节单元中

将整数数组写入0x40003000开始的连续10个字节内存单元中&#xff0c;注意unsigned char *指向一个字节&#xff0c;而int *指向1个字&#xff08;4个字&#xff09;&#xff0c;但是可以把字中存储的整数放入字节单元中&#xff0c;只要不超过表示的范围&#xff0c;注意虽然un…

mysql读书笔记----时间函数

1.获得当前时间&#xff1a;时间格式yyyy-MM-dd curdate();2.DAYOFWEEK(date) 3.WEEKDAY(date) 4.DAYOFMONTH(date) 5.DAYOFYEAR(date) 6.MONTH(date) 7.DAYNAME(date) 8.MONTHNAME(date) 9.QUARTER(date) 10.WEEK(date) WEEK(date,first) 11.YEAR(date) 12.HOUR(time) 13.MINU…

企业数据1

1. 企业数据 1.1. 全局 1.1.1. 货币 CNY Chinese Yuan Renminbi &#xffe5; 6.825020 ARS Argentine Peso $ 3.791090 BOB Bolivian Boliviano $b 7.570800 BRL Brazilian Real R$ 1.766500 CAD Canadian Dollar $ 1.037570 CLP Chilean Peso $ …

sql判断语句

方法一&#xff1a; <if test"null ! orderType and 0 orderType"> order by amountTimes desc </if><if test"null ! orderType and 1 orderType">order by amountTimes asc </if><if test"null ! orderType and 2 …

Thinkphp 整合tcpdf

网上查了些关于tcpdf 使用教程&#xff0c;整合到TP的话&#xff0c;会有些小问题&#xff0c;由于基础还不是很扎实&#xff0c;花了点时间终于整合OK了。下面介绍步骤&#xff1a; 环境&#xff1a; TP版本&#xff1a;TP3.2.2 tcpdf:tcpdf_6_2_3 1. 将tcpdf_6_2_3.zip解压在…

多项目开发下的dll文件管理

阅读目录&#xff1a;DS01&#xff1a;为什么要对生成的dll文件进行管理&#xff1f;DS02&#xff1a;首先介绍以下两个DOS命令DS03&#xff1a;第一种实现方法&#xff08;xcopy&#xff09;DS04&#xff1a;第二种实现方法&#xff08;attrib&#xff09;DS05&#xff1a;分享…

关于Java中的随机数产生

对比两种写法&#xff1a; 第一种&#xff1a; public static void main(String args[]){Random random new Random(System.currentTimeMillis());for(int i0; i<20; i){int sindex random.nextInt(2);System.out.println(sindex);}}第二种&#xff1a; public static voi…

视图

视图是虚表&#xff0c;是从一个或几个基本表&#xff08;或视图&#xff09;中导出的表&#xff0c;在系统的数据字典中仅存放了视图的定义&#xff0c;不存放视图对应的数据。视图是原始数据库数据的一种变换&#xff0c;是查看表中数据的另外一种方式。可以将视图看成是一个…

选择器的并发性

4.3.4 并发性 选择器对象是线程安全的&#xff0c;但它们包含的键集合不是。通过keys( )和selectKeys( )返回的键的集合是Selector对象内部的私有的Set对象集合的直接引用。这些集合可能在任意时间被改变。已注册的键的集合是只读的。如果您试图修改它&#xff0c;那么您得到的…

mysql 自定义函数之判断

DELIMITER $$CREATE DEFINERrootlocalhost FUNCTION getMin(a int,b int) RETURNS int(11)BEGINdeclare min int;if(a>b)then set min b;elseif(b>a)then set min a;else set min 0;#end if;end if;RETURN min;END 调用该函数可以如下方式 select getMin(1,2); 返回值…