JSONP跨域GET请求解决Ajax跨域访问问题


Posted in Javascript onDecember 31, 2014

前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息。实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应,怎么回事?代码没怎么改动,唯一修改的地方就是jQuery的ajax方法中的url地址。难道是这里的问题,经过检查和调试,发现原来是同源策略在作怪,我们知道,JavaScript或jQuery是在Web前端开发中经常使用的动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档或脚本 在同一域名下的内容。不同域名下的脚本不能互相访问,即便是子域也不行。关于同源策略,读者可百度更详细的解释,这里不再赘述。

但是有时候又不可避免地需要进行跨域操作,这时候“同源策略”就是一个限制了,怎么办呢?采用JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并探讨下JSONP跨域的原理。

这里提到了JSONP,那有人就问了,它同JSON有什么区别不同和区别呢,接下我们就来看看,百度百科有以下说明:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)。

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

到这里,应该明白了,JSON是一种轻量级的数据交换格式,像xml一样,是用来描述数据间的。JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。

那JSONP是如何工作的呢,我们知道,由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。若要跨域请求出于安全性考虑是不行的,但是我们发现,Web页面上调用js文件时则不受是否跨域的影响,而且拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>,这时候,聪明的程序猿就想到了变通的方法,如果要进行跨域请求, 通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递 javascript对象。即在跨域的服务端生成JSON数据,然后包装成script脚本回传,着不就突破同源策略的限制,解决了跨域访问的问题了么。

下面我们就看下怎么实现:

前端代码:

function CallWebServiceByJsonp() {

        $("#SubEquipmentDetails").html('');

        $.ajax({

            type: "GET",

            cache: false,

            url: "http://servername/webservice/webservice.asmx/GetSingleInfo",

            data: { strCparent: $("#Equipment_ID").val() },

            dataType: "jsonp",

            //jsonp: "callback",

            jsonpCallback: "OnGetMemberSuccessByjsonp"

        });

}

function OnGetMemberSuccessByjsonp(data) {

    //处理data

    alert(data);

}

后端的WebService代码:

[WebMethod]

[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]

public void GetSingleInfo(string strCparent)

{

    string ret = string.Empty;

    HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";

    string jsonCallBackFunName = HttpContext.Current.Request.Params["callback"].ToString();

    //string jsonCallBackFunName1 = HttpContext.Current.Request.QueryString["callback"].Trim();

    //上面代码必须

    //中间代码执行自己的业务操作,可返回自己的任意信息(多数据类型)

    BLL.equipment eq_bll = new BLL.equipment();

    List<Model.equipment> equipmentList = new List<Model.equipment>();

    equipmentList = eq_bll.GetModelEquimentList(strCparent);

    ret = JsonConvert.SerializeObject(equipmentList);

    //下面代码必须

    HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, ret));

    HttpContext.Current.Response.End();

}

如上所示,前端的CallWebServiceByJsonp方法采用jQuery的ajax方法调用后端的Web服务GetSingleInfo方法,后台的GetSingleInfo方法,使用前端的回调方法OnGetMemberSuccessByjsonp包装后台的业务操作的JSON对象,返回给前端一段javascript片段执行。巧妙的解决了跨域访问问题。

JSONP的缺点:

JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。

小伙伴们是否对JSONP跨域GET请求解决Ajax跨域访问问题有所了解了呢,本文的思路还是非常不错的,推荐给大家。

Javascript 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
页面使用密码保护代码
Apr 10 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
Jun 25 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
Vue 使用中的小技巧
Apr 26 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
Sep 19 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
JavaScript中的异常捕捉介绍
Dec 31 #Javascript
JavaScript中对象介绍
Dec 31 #Javascript
JavaScript中用字面量创建对象介绍
Dec 31 #Javascript
javascript设计模式之中介者模式Mediator
Dec 30 #Javascript
javascript实现window.print()去除页眉页脚
Dec 30 #Javascript
Javascript访问器属性实例分析
Dec 30 #Javascript
Javascript中数组sort和reverse用法分析
Dec 30 #Javascript
You might like
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
arguments对象
2006/11/20 Javascript
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
护士的岗位职责
2013/12/04 职场文书
实习生工作证明范本
2014/09/14 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
毕业生自荐信范文
2015/03/05 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
如何Python使用re模块实现okenizer
2022/04/30 Python
MySQL分布式恢复进阶
2022/07/23 MySQL