很久没有写随笔了,总是感觉没时间,其实时间就是。。。废话少说,前几天,工作上有一新需求,需要前端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脚本回传,着不就突破同源策略的限制,解决了跨域访问的问题了么。

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

前端代码:

functionCallWebServiceByJsonp() {$("#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"});
}functionOnGetMemberSuccessByjsonp(data) {//处理data
alert(data);
}

后端的WebService代码:

[WebMethod]
[ScriptMethod(ResponseFormat= ResponseFormat.Json, UseHttpGet = true)]public voidGetSingleInfo(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= newBLL.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不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。

转载于:https://www.cnblogs.com/coprince/p/5803328.html

浅析JSONP-解决Ajax跨域访问问题相关推荐

  1. jsonp跨域的缺点ajax缺点,浅析JSONP解决Ajax跨域访问问题的思路详解

    前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问 ...

  2. php json -gt;访问,【转】Php+ajax+jsonp解决ajax跨域问题

    首先:jsonp是json用来跨域的一个东西. 原理是通过script标签的跨域特性来绕过同源策略. 发送端: $.ajax({ type : "post", url : &quo ...

  3. jsonp解决ajax跨域问题,用JSONP解决ajax跨域问题

    JSONP:JSON With Padding 要点: 1.script标签 2.用script标签加载资源是没有跨域问题的 概要: 在资源加载进来之前先定义一个函数,这个函数接受一个参数(数据),函 ...

  4. ashx 跨域_使用ashx解决ajax跨域访问的问题

    由于跨域访问是被IE的安全访问拒绝掉的 需要使用web代理 新建一个proxy.ashx文件 在proxy.ashx里建一个webservice 代码如下: [WebService(Namespace ...

  5. ashx 跨域_使用ashx解决ajax跨域访问的问题 | 学步园

    由于跨域访问是被IE的安全访问拒绝掉的 需要使用web代理 新建一个proxy.ashx文件 在proxy.ashx里建一个webservice 代码如下: [WebService(Namespace ...

  6. 利用JSONP解决AJAX跨域问题的原理与jQuery解决方案

    写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨 ...

  7. jQuery利用JSONP解决AJAX跨域请求

    出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. JSON(Ja ...

  8. apache ajax 跨域访问,AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 crossdomain.x ...

  9. ajax跨域请求Jsonp实现,使用jsonp实现ajax跨域请求

    Jsonp(JSON with Padding)是资料格式 json 的一种"使用模式",可以让网页从别的网域获取资料. 由于同源策略,一般来说位于 server1.example ...

  10. Ngnix解决Ajax跨域问题

    前台 我们首先前台向后台发送Ajax请求,如下:这里用的是HBuilder X开发工具 端口号默认是8848 <script src="js/jquery-3.3.1.js" ...

最新文章

  1. docker官方文档中文版_Docker官方文档翻译5
  2. 万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型
  3. python @classmethod 和 @staticmethod区别,以及类中方法参数cls和self的区别
  4. 这篇 CPU Cache,估计要消化一下
  5. 疫情反复,电赛会取消吗?
  6. android crop 大图,com.android.camera.action.CROP 实现图片剪裁
  7. jsp点选框_Jsp单选框
  8. 计算机专业基础857考试大纲,2018年哈尔滨工业大学854计算机基础考研大纲
  9. php preg split,php preg_split()字符串分割函数的使用方法
  10. android 系统框架 dx
  11. Nagios插件开发指导
  12. 参考文献:《基于非合作博弈的风-光-氢微网容量优化配置》 原文程序,多分布式电源参与的混合微电网容量优化配置是微电网设计的一个重要环节
  13. Maxwell 一款简单易上手的实时抓取Mysql数据的软件
  14. 小米路由器,设置自定义Samba路径,直接访问磁盘根目录
  15. 批量下载bilibili视频
  16. 压缩软件替代方案BandZip
  17. you-get的一点修改
  18. 如何判断linux是32位还是64位?
  19. 无需注解快速生成API文档,跟SpringBoot绝配
  20. Day18JavaSE——Map集合Collections工具类集合案例练习

热门文章

  1. learning java AWT 布局管理器 GridLayout
  2. VI 编辑器保存命令
  3. 查看电脑的s/n序列号信息方式
  4. 经典测试用例--水杯测试
  5. 数据结构(6)----栈与队列之栈的链式存储结构及其实现
  6. js分页工具分页功能实现
  7. linux 下idea 启动tomcat报JMX 1099错误解决办法
  8. python学习之老男孩python全栈第九期_day022作业
  9. 11月22日学习内容整理:bootstrap居中处理和组件,常用组件
  10. Xshell5 访问虚拟机Ubuntu16.04