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获得CheckBoxList选中的数量
Oct 27 Javascript
详解AngularJS中的filter过滤器用法
Jan 04 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 Javascript
Javascript打印局部页面实例
Jun 21 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
vue todo-list组件发布到npm上的方法
Apr 04 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
Angular2之二级路由详解
Aug 31 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
javascript中数组的常用算法深入分析
Mar 12 Javascript
vue+ESLint 配置保存 自动格式化代码
Mar 17 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
python发送伪造的arp请求
2014/01/09 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
python的exec、eval使用分析
2017/12/11 Python
flask框架视图函数用法示例
2018/07/19 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python对列表的操作知识点详解
2019/08/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
什么是python的函数体
2020/06/19 Python
python缩进长度是否统一
2020/08/02 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
用Python实现职工信息管理系统
2020/12/30 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
护士岗位职责
2014/02/16 职场文书
超越自我演讲稿
2014/05/21 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
长城的导游词
2015/01/30 职场文书
街道社区活动报告
2015/02/05 职场文书
校本培训个人总结
2015/02/28 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
小学校园广播稿
2015/08/18 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python