JSONP跨域请求


Posted in Javascript onMarch 02, 2017

什么是跨域:

1、域名不同

2、域名相同端口不同

js出于对安全考虑不支持跨域请求。我们可以使用JSONP解决跨域问题。

一、JSONP是什么

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

原理:浏览器在js请求中,是允许通过script标签的src跨域请求,可以在请求的结果中添加回调方法名,在请求页面中定义方法,既可获取到跨域请求的数据。(js请求的不是一个单纯的json数据而是一段包含json数据的js脚本)

JSONP跨域请求

二、模拟JSONP

服务器域名:http://localhost:8081/rest/itemcat/list

客户端服务器:http://localhost:8082/test.html

1、普通的JS跨域请求

服务器数据:

JSONP跨域请求

客户端请求代码:

$(function(){
  $.ajax(    {url: "http://localhost:8081/rest/itemcat/list?callback=myFunction", 
     success: function(data){
      console.info(data)
   }}); 
 });

结果

XMLHttpRequest cannot load http://localhost:8081/rest/itemcat/list?callback=myFunction. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8082' is therefore not allowed access.

2、模拟JSONP请求

客户端请求代码:

$(function(){
  greateScript("http://localhost:8081/rest/itemcat/list");
  function greateScript(src) {
   $("<script><//script>").attr("src", src).appendTo("body")
  } 
 });

结果:

list?_=1488425374097:1 Uncaught SyntaxError: Unexpected token :

三、使用JSONP

环境:

服务器域名:http://localhost:8081/rest/itemcat/list

客户端服务器:http://localhost:8082/test.html

服务端代码(本人使用springmvc4):

@RequestMapping("/itemcat/list")
 @ResponseBody
 public Object getItemCatList(String callback) {
  CatResult catResult = itemCatService.getItemCatList();
  MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(catResult);
  //设置JSONP回调函数
  mappingJacksonValue.setJsonpFunction(callback);
  return mappingJacksonValue;
 }

客户端调用代码:

$(function(){
  $.ajax(
   { url: "http://localhost:8081/rest/itemcat/list", 
    dataType: "jsonp",
    jsonp: "callback",
    success: function(data){
    console.info(data)
   }}); 
 });

结果:

JSONP跨域请求

看返回结果可以发现返回的数据不是一段单纯的json数据,而是一段js函数。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
Jan 16 Javascript
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
解析Javascript中大括号“{}”的多义性
Dec 02 Javascript
jquery做的一个简单的屏幕锁定提示框
Mar 26 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
基于jQuery实现淡入淡出效果轮播图
Jul 31 Javascript
js 获取图像缩放后的实际宽高,位置等信息
Mar 07 Javascript
JavaScript实现瀑布流图片效果
Jun 30 Javascript
JS实现简单日历特效
Jan 03 Javascript
JavaScript TAB栏切换效果的示例
Nov 05 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
jquery easyui dataGrid动态改变排序字段名的方法
Mar 02 #Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 #Javascript
如何正确理解javascript的模块化
Mar 02 #Javascript
jquery实现左右滑动式轮播图
Mar 02 #Javascript
如何写好你的JavaScript【推荐】
Mar 02 #Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 #Javascript
JS操作input标签属性checkbox全选的实现代码
Mar 02 #Javascript
You might like
php实现的短网址算法分享
2014/06/20 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
jQuery版仿Path菜单效果
2011/12/15 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python序列类型的打包和解包实例
2019/12/21 Python
python在协程中增加任务实例操作
2021/02/28 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
海飞丝广告词
2014/03/20 职场文书
春节联欢会策划方案
2014/05/16 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
2015大学生实训报告
2014/11/05 职场文书
聚会通知怎么写
2015/04/23 职场文书
详解php中流行的rpc框架
2021/05/29 PHP