码迷,mamicode.com
首页 > Web开发 > 详细

Jsonp跨域请求Uncaught SyntaxError解决方案

时间:2015-06-30 12:32:22      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

跨域请求是什么就不再解释了。

需要请求的链接:http://192.168.19.22/appsservice/home/jstest(本地的范例链接)

请求链接正常返回json数据格式如下:

{"name":"test","value":"sfsdf"}

 使用Jquery Jsonp请求代码

<script src="~/Scripts/jquery-1.7.1.min.js"></script>

<script type="text/javascript">
   

    $(function () {
        $("#test").click(function () {
            $.ajax({
                url: ‘http://192.168.19.22/appsservice/home/jstest‘,
                dataType: "jsonp",
                jsonp: "callback",
                success: function (data) {
                    alert(data.name);
                }
            })

        });


    });
</script>

<div id="test">获取</div>

 这样当点击获取按钮时,浏览器会直接报错,如下

技术分享

Jsonp是需要服务器使用callback的参数值:jQquery1710508893103338778_1435633281092输出一个javascript的执行函数来运行的,如

jQquery1710508893103338778_1435633281092({"name":"test","value":"sfsdf"}),如果服务器不输出一个js函数,默认直接把输出的json字符串或者其他输出结果当成一串js执行,这就是出现上述错误的原因。

服务器对于Jsonp的请求要进行一下特殊处理一下,才能让客户端正确处理数据。以下是MVC添加一个ActionFilter对Jsonp请求进行处理,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Newtonsoft.Json;

namespace Simple.AppsService
{
    public class JsonpAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在执行操作结果后更改返回结果
        /// </summary>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            string callback = filterContext.HttpContext.Request["callback"];
            if (!string.IsNullOrEmpty(callback))
            {
                //判断返回的结果为JsonResult
                if (filterContext.Result is JsonResult)
                {
                    JsonResult result = (JsonResult)filterContext.Result;
                    //序列化json数据
                    string json = JsonConvert.SerializeObject(result.Data);
                    //使用callback参数的函数名输出可执行的js函数
                    string newres = string.Format("{0}({1})", callback, json);
                    //清空已经生成的数据
                    filterContext.HttpContext.Response.Clear();
                    //输出新的数据
                    filterContext.HttpContext.Response.Write(newres);
                }
            }
        }
    }
}

在每个Controller的Action上打上标签

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Simple.AppsService.Controllers
{
    public class HomeController : Controller
    {
        [Jsonp]
        public JsonResult Jstest()
        {
            return Json(new { name = "test", value = "sfsdf" }, JsonRequestBehavior.AllowGet);
        }
    }
}

当使用Jsonp时,请求参数里面有callback参数,服务器判断请求参数里面有callback参数,对输出结果使用特殊的格式,callback();

这不算是问题解决方案,应该算是Jsonp的用法范例吧,如果有朋友遇上此问题,希望以上能有所启发!

 

Jsonp跨域请求Uncaught SyntaxError解决方案

标签:

原文地址:http://www.cnblogs.com/stealth7/p/4609957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!