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 相关文章推荐
通过JS获取用户本地图片路径并显示的代码
Feb 16 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
JavaScript基础函数整理汇总
Jan 30 Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 Javascript
深入浅出讲解ES6的解构
Aug 03 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
Rollup处理并打包JS文件项目实例代码
May 31 Javascript
vue脚手架搭建过程图解
Jun 06 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
修改Vue打包后的默认文件名操作
Aug 12 Javascript
vue实现表格合并功能
Dec 01 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 flv视频时间获取函数
2010/06/29 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
php中in_array函数用法探究
2014/11/25 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
PHP echo()函数讲解
2019/02/15 PHP
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
Python 功能和特点(新手必学)
2015/12/30 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python numpy 按行归一化的实例
2019/01/21 Python
实例介绍Python中整型
2019/02/11 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
市三好学生主要事迹
2014/01/28 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android