JSONP 是什么

说实话,我学了这么久,其实也没有好好了解这个东西,当然平常自己在前端方面也涉猎较浅。

1) jsonp 是什么

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的 跨域 数据访问的问题。

跨域? 由于同源策略的原因,也就是说你请求资源时,浏览器对于不是你当前域名或者端口号都相同的地址给与禁止访问,不允许你获取资源

同源策略:

  • examle.com:8080 与 examle.com:9090 不同源
  • examle.com:8080 与 examle.com:9090 不同源
  • a.examle.com 与 examle.com 不同源

2) 如何解决同源策略带来的问题

浏览器中对<script>、<img>、<iframe> 是给予支持的,所以我们可以采用类似引用数据的方式来获取资源

处理流程:

  • 远程服务器取得js前端处理数据的函数名
  • 将相关需要返回的数据保存
  • 将数据串进行拼接,以函数的方式返回:showData(['a','b'])

3) 使用例子


// JS
&lt;button class="getRequest"&gt;发起跨域请求&lt;/button&gt;
&lt;textarea name="" id="" cols="30" rows="10" disabled&gt;&lt;/textarea&gt; &lt;script&gt;
function showdata(result) {
console.log(result);
}
$('.getRequest').on('click', function(){
//1) // $('head').append("&lt;script src='http://localhost/jsonp/service.php?jsonp=showdata'&gt;&lt;\/script&gt;"); //2)
$.ajax({
url : 'http://localhost/jsonp/service.php',
type: 'GET',
dataType: 'jsonp',
jsonp: 'jsonp', // 自定义,保证后端能通过这个key值获取函数名
jsonpCallback: "showdata",//自定义的jsonp回调函数名称
success: function (json) {
alert('success');
},
error: function () {
alert('fail');
}
})
})
&lt;/script&gt; -------------------- header('Content-type: application/json');
//获取回调函数名
$jsonp = htmlspecialchars($_REQUEST ['jsonp']);
//json数据
$json_data = '["customername1","customername2"]';
//输出jsonp格式的数据
echo $jsonp . "(" . $json_data . ")"; // 格式进行拼接,得到showdata(["customername1","customername2"]); --------------

由此可见,其实就是远程服务器代前端处理了相关函数,通过返回一个带参数的函数表达式,来进行执行相关逻辑代码。 有效避免了直接向远程服务器请求数据

原文地址:https://segmentfault.com/a/1190000016707550

SONP 是什么的更多相关文章

  1. sonp跨域请求

    sonp跨域请求学习笔记   前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以 ...

  2. ajax j跨域请求sonp

    需求 遇到的问题 解决方案 需求 如今,该项目需要获得数据访问外部链接.它是跨域.使用ajax 直提示: 遇到的问题 1. 怎样使用ajax 跨域请求数据 2. 能不能post请求 解决的方法 经过网 ...

  3. jQuery的$.ajax

    在介绍JSONP之前,先简单的介绍一些JSON.JSON是JavaScript Object Notation的缩写,是一种轻量的.可读的基于文本的数据交换开放标准.源于JavsScript编程语言中 ...

  4. jQuery与ajax 基础运用

    jQuery是一个轻量级js框架,使用方便快捷,更是封装ajax处理方法,如$.load() $.get() $.post() 等 但最常用的方法还是$.ajax() 一.一般的格式为 $.ajax( ...

  5. JQuery中$.ajax()方法参数详解

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  6. JQuery中$.ajax()方法参数详解 及 async属性说明

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  7. 前端之ajax

    前端之ajax 本节内容 ajax介绍 原生js实现ajax jquery实现ajax json 跨域请求 1. ajax介绍 AJAX(Asynchronous Javascript And XML ...

  8. $.ajax()方法详解

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  9. jquery中的ajax参数说明

    本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...

随机推荐

  1. bzoj 4010: [HNOI2015]菜肴制作【拓扑排序】

    也就是给定有向图,求最小字典序的拓扑序,直接用小根堆就行(或者反着建图用大根堆) #include<iostream> #include<cstdio> #include< ...

  2. 测试人员,今天再不懂BDD就晚了!

    首先,测试人员应该参与软件开发的全流程,这一点已经是软件行业的共识了. 其次,新技术.新框架.新思路不断涌现的今天,测试人员除了传统的功能测试,也要不断与时俱进,主动承担起自动化测试.性能测试等.除了 ...

  3. 洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

    HDU-1686 P3375 kmp介绍: http://www.matrix67.com/blog/archives/115 http://www.cnblogs.com/SYCstudio/p/7 ...

  4. HDOJ 5475 An easy problem

    题目传送门 题意:一个计算器,两种操作,乘上x,或者除掉之前的某个x,结果取模输出 分析:因为取模不支持除法,然后比赛时想到用逆元,结果发现MOD需要与b互质,结果一直苦苦寻找求逆元的其它方法.后来队 ...

  5. 使用Appache部署WEB服务器

    Apache的起源(这个就不说了,百度下就都有了) 简介:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行, ...

  6. SOLR-disMax查询参数

    dismax参数用于处理用户输入的简单短语,并根据字段的重要度进行加权查询,查询范围为多个字段区域.dismax会忽略搜索字符串中的 "AND","OR", & ...

  7. UVa OJ 458

     The Decoder  Write a complete program that will correctly decode a set of characters into a valid m ...

  8. 复习-PEP8规范(转)

    PEP8 Python 编码规范 一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换 ...

  9. CF962D Merge Equals

    思路: 不必每次都找最小的值进行合并,从前往后扫一遍的过程中能合并就一直合并. 实现: #include <bits/stdc++.h> using namespace std; type ...

  10. 在idea启动tomcat出现The JAVA_HOME environment variable is not defined correctly的解决

    情况:某套代码是用jdk 1.6编译,然后电脑的JAVA_HOME系统变量配的是jdk1.7的,在tomcat启动时报错 The JAVA_HOME environment variable is n ...