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 遍历对象的属性的代码
Dec 29 Javascript
用JavaScript实现动画效果的方法
Jul 20 Javascript
详解jquery事件delegate()的使用方法
Jan 25 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
Jul 13 Javascript
原生js实现放大镜
Feb 20 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
May 11 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
React从react-router路由上做登陆验证控制的方法
May 10 Javascript
vue 父组件通过v-model接收子组件的值的代码
Oct 27 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 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扩展
2013/06/13 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
浅析Ajax语法
2016/12/05 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
iview实现图片上传功能
2020/06/29 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
python运行时间的几种方法
2016/06/17 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python递归函数绘制分形树的方法
2018/06/22 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
初学者学习Python好还是Java好
2020/05/26 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
全球度假村:Club Med
2017/11/27 全球购物
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
Oracle性能调优原则
2012/05/03 面试题
Mysql基础知识点汇总
2021/05/26 MySQL
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python