Ajax如何跨域访问数据

最近在做项目的过程中遇到的问题,一个网站需要访问另外一个网站的数据,并且是通过脚本的方式,而由于同源策略的限制,开发人员不能再与外部服务器进行通信的时候使用XMLHttpRequest。而JSONP是一种可以绕过同源策略的方法,即通过使用JSON与<script>标记相结合的方法,从服务器端直接返回可执行的JavaScript函数或者JavaScript对象。目前JSONP已成为大部分公司的Web应用程序跨域首选,尽管JSONP是一个非官方的协议,关于JSONP的介绍,网上一大把;现在开始介绍如何跨域访问数据。

  开发环境:Visual Studio 2008 + jQuery

  前端代码(调用方):

  var baseUrl = "http://localhost:59334/";

  $.ajax({
            url: baseUrl + "Account/ValidateCode?validateCode=" + code + "&jsoncallback=?",
            type: 'GET',
            dataType: 'JSON',
            success: function(data) {
              console.log(data.Content);
            },
            error: function() {
                  console.log(arguments);
            }
      });

  后台代码(被调用方,C#):

  public String ValidateCode(String validateCode)
        {
            String callback = Request["jsoncallback"];
            String result = "";
            if (Session["CaptchaCode"] != null)
            {
                if (Session["CaptchaCode"].ToString().ToLower() != validateCode.ToLower())
                {
                    result = "0";
                    if (!String.IsNullOrEmpty(callback))
                    {
                        result = callback + "({Success:'True',Content:'0'})";
                    }
                }
                else
                {
                    tick = 0;
                    emailValiCodeExpired = false;
                    result = "1";
                    if (!String.IsNullOrEmpty(callback))
                    {
                        result = callback + "({Success:'True',Content:'1'})";
                    }
                }
            }
            if (String.IsNullOrEmpty(result))
            {
                if (!String.IsNullOrEmpty(callback))
                {
                    result = callback + "({Success:'True',Content:'0'})";
                }
                else
                {
                    result = "0";
                }
            }
            return result;
        }

  调用方和被调用方是两个Web应用程序;

  关于"jsoncallback=?",在发送ajax请求时,jQuery自动把jsoncallback后面的 "?" 替换为正确的函数名(回调函数)

  (一般长这个样:"jQuery1830798391871119546_1449898179923"),以执行回调函数,所以在C#返回的字符串应该这样写:

  String result = callback + "({Success:'True',Content:'1'})";

  其实返回的是形如下方的一段jQuery脚本:

  "jQuery1830798391871119546_1449898179923({Success:'True',Content:'1'})"

  注意红色字部分,这是一段json格式的数据,因为,发送ajax请求时要求返回的数据格式是JSON

  切不可将result写成这样:return Json(result, JsonRequestBehavior.AllowGet);写成这样的话,回调函数就被序列化了,最终也没法执行;

  常见的错误: 1 jQuery1830798391871119546_1449898179923 was not called

         2 parsererror

         3 已阻止跨源请求:同源策略禁止读取位于 http://localhost:59334/Account/ValidateCode?validateCode=rucr 的远程资源。(原因:CORS 头缺少             'Access-Control-Allow-Origin')。

  第一个错误可能是由于发送ajax请求时未加入"jsoncallback=?"这一句

  如果dataType写的是"JSONP",那么请求的url里面可以不带"jsoncallback=?",服务器端需要用Request["callback"]来获取回调函数,也就是形如下方代码:

  前端代码:

  $.ajax({
            url: baseUrl + "Account/ValidateCode?validateCode=" + code,
            type: 'GET',
            dataType: 'JSONP',
            success: function(data) {
              console.log(data.Content);
            },
            error: function() {
                  console.log(arguments);
            }
      });

  后台代码(简写):

  String callback = Request["callback"];
      String result = callback + "({Success:'True',Content:'1'})";
      return result;

  一般错误2会和错误1一起出现,可能是返回的结果中{Success:'True',Content:'1'}这部分代有误,造成回调函数没法解析JSON数据;

  至于错误3则是跨域失败,在发送ajax请求时就有问题,可能是请求的url没加"jsoncallback=?"也可能是dataType没指定为"JSONP"格式,注意:

  在URL里面加jsoncallback=?和dataType指定为"JSONP",二选一即可;如果dataType是"JSONP",那么发送请求时,jQuery会自动在url里面加上             callback=jQuery1830798391871119546_1449898179923这句,上面有说明,不再赘述;

  OK说明完毕!

  

  

  

Ajax跨域访问的更多相关文章

  1. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  2. ajax跨域访问的解决方案

    今天的工作中要访问摄像机内部的一个web站点,这就涉及到jquery的ajax跨域访问的问题.我使用的是jquery1.7的版本,下面总结如下: 问题一:一开始用IE调试,总是返回No Transpo ...

  3. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  4. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  5. ajax 跨域访问的解决方案

    ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...

  6. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  7. 关于JQuery Ajax 跨域 访问.net WebService

    关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...

  8. JS Ajax跨域访问

    js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...

  9. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

  10. Ajax跨域访问wcf服务中所遇到的问题总结。

    工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...

随机推荐

  1. javascript获取浏览器窗口大小

    var w=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var h= ...

  2. 腾讯优测优分享 | Android性能测试工具化实现

    腾讯优测专业的移动云测试平台,自动化测试提供性能测试数据,云真机实时输出性能数据,让测试更简单! 1.Android性能测试介绍 提到Android性能测试,我们总免不了俗地要首先介绍下Android ...

  3. ionic slidebox 嵌套问题

    ionic slidebox 嵌套 会有一个 冒泡 事件 , 即使是 阻止了 父级冒泡也不管用 , 最终 用  滑动 事件on-drag="drag()"   去阻止 了父级的 滑 ...

  4. Hammer.js--转载自李林峰的园子

    一.前言 移动端框架当前还处在初级阶段,但相对于移动端的应用来说已经有很长时间了.虽然暂时还没有PC端开发的需求量大,但移动端的Web必然是一种趋势,在接触移动端脚本的过程中,最开始想到的是juqer ...

  5. Spark2.0自定义累加器

    Spark2.0 自定义累加器 在2.0中使用自定义累加器需要继承AccumulatorV2这个抽象类,同时必须对以下6个方法进行实现: 1.reset 方法: 将累加器进行重置; abstract  ...

  6. URL Scheme APP跳转safari以及跳回APP

    上图 : 在plist文件里面设置. URL identifier 一般为反域名+项目名称 (尽可能保证少重复) URL Schemes是一个数组.一个APP可以添加多个.该参数为跳转时使用的标识. ...

  7. Java操作redis简单示例

    第一:安装Redis    首先我们要安装Redis,就像我们操作数据库一样,在操作之前肯定要先创建好数据库的环境.    Redis的下载可以百度一下,或者打开下面的下载链接:    https:/ ...

  8. JavaScript分离代码理解

    window.onload=prepareLinks; //页面加载触发onload事件 function prepareLinks(){ //定义函数 var links=document.getE ...

  9. 数据注解和验证 – ASP.NET MVC 4 系列

           不仅在客户端浏览器中需要执行验证逻辑,在服务器端也需要执行.客户端验证能即时给出一个错误反馈(阻止请求发送至服务器),是时下 Web 应用程序所期望的特性.服务器端验证,主要是因为来自网 ...

  10. H5页面在QQ和微信上分享,为什么不能自定义设置图片和摘要?

    [记录]title标签中的页面标题为抓取标题.body内第一个img标签内的图片为自动抓取缩略图,图片宽高要大于300,如果不希望显示出来,将标签宽高皆设置为0.摘要显示为来源链接,如需自定义需要通过 ...