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高级程序设计 XML、Ajax 学习笔记
Sep 10 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 Javascript
Jquery实现图片预加载与延时加载的方法
Dec 22 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
May 10 Javascript
JS验证全角与半角及相互转化的介绍
May 18 Javascript
Vue写一个简单的倒计时按钮功能
Apr 20 Javascript
js blob类型url的视频下载问题的解决
Nov 29 Javascript
js实现中文实时时钟
Jan 15 Javascript
js实现飞机大战小游戏
Aug 26 Javascript
js实现有趣的倒计时效果
Jan 19 Javascript
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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python opencv摄像头的简单应用
2019/06/06 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
学python最电脑配置有要求么
2020/07/05 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
2013的个人自我评价
2013/12/26 职场文书
学校大课间活动方案
2014/01/30 职场文书
《自然之道》教学反思
2014/02/11 职场文书
2014会计年终工作总结
2014/12/20 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书