在web开发中,如果你要在不同域下进行数据异步请求,会出现一个No ‘Access-Control-Allow-Origin’ header is present on the requested resource.”的错误提示。
该提示信息说明,跨域请求是违反了“同源策略”的。
但是在开发中又难免会遇到跨域请求的需求,所以前辈们也是留下了跨域请求数据的方法jsonp跨域请求。

我们以最为典型的Jquery做例子,后台用的asp.net mvc。
我们先构造一个action的返回对象,用于返回jsonp数据

#region JsonResult
public class JsonpResult<T> : ActionResult
{
public T Obj { get; set; }
public string CallbackName { get; set; } public JsonpResult(T obj, string callback)
{
this.Obj = obj;
this.CallbackName = callback;
} public override void ExecuteResult(ControllerContext context)
{
var js = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")"; context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.Write(jsonp);
}
} #endregion

写一个供前台调用的action ,callback参数是必须的一个参数

public ActionResult AjaxJsonp(string s, string f,string callback)
{
string result=s+'-'+f;
return new JsonpResult<object>(new { result = result }, callback);
}

然后我们在前台用Ajax跨域调用该方法(如果是在本地测试,在不同的端口号下即可)

$.ajax({
type: "GET",
url: "AjaxJsonp?callback=?",
data: { s: '',f:''},
cache: false,
error: function () {
alert("程序出错,请联系管理员.");
},
dataType: "jsonp",
jsonp: 'callback',
success: function (result) {
if (result) {
//返回对象处理
}
}
});

原理:

类似于使用js创建一个script元素,引用的地址就是我们请求的地址。

既然引用了该地址,而我们的地址输出的是:

callback(data);

这就相当于执行了一个函数:callback,并把data传入了这个函数,所以我们就拿到了data;

介绍Ajax jsonp跨域请求的参数说明

    • type:请求的类型(get/post),这里需要注意的是,跨域请求只能是Get方式请求,这是因为限制于实现跨域的原理,但你会发现,将type写为post同样能执行,这是为什么呢?
      在仔细查看监控的请求方式,其实还是GET方式,这就说明Jquery在内部已经做了处理,所以跨域请求只能是get请求,请求数据量是很有限的。
    • url:url后面的callback=?是必须的,Jquery会将?号生成一个随机的名字,用于回调
    • data:传递的参数
    • cache:是否开启缓存,如果请求的数据是不变的,那么可以开启缓存提高效率
    • dataType:一定是jsonp
    • jsonp:callback名一般使用默认callback,可自行修改
    • error:请求出错时执行
    • success:请求成功回调并返回结果数据

mvc中使用jsonp进行跨域请求详细说明的更多相关文章

  1. js中ajax如何解决跨域请求

    js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...

  2. 使用jsonp进行跨域请求

    使用jsonp进行跨域请求 在实际的业务中很多时候需要用到跨域请求,然而jsonp为我们提供了一种非常方便的跨域请求的方式,具体实现代码如下: $.ajax({ type:"get" ...

  3. 关于使用Jsonp做跨域请求

    今天在使用Jsonp做跨域请求的练习时碰上这样一个问题 代码如下 <!DOCTYPE html> <html> <head> <meta charset=&q ...

  4. 利用JSONP实现跨域请求

    前言:有时候一忙起来就没了时间观念,原来我已经有十多天没写博客了.一直想做跨域方面的尝试,无奈最近准备校招没时间动动手.今天就先讲讲JSONP吧,昨晚还在研究QQ空间日志里面网络图片的问题呢,我发现日 ...

  5. Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

    由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...

  6. spring-security中的csrf防御机制(跨域请求伪造)

    什么是csrf? csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点.CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社 ...

  7. jsonp原理,跨域请求头处理

    一.jsonp(解决跨域)思路介绍: 因浏览器的同源策略不会拦截link标签内的src请求,所以利用这一点,我们把后端开放的接口路径放在src内, 其在发送请求后会自动接收返回的东西,所以我们可以给要 ...

  8. CORS和jsonp实现跨域请求

    同源策略:所谓同源是指,域名,协议,端口相同,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略.当浏览器同时打开两个tab页面(两个不同服务器 ...

  9. 来说说SpringMVC + JSONP的跨域请求

    先来说说场景,JSON,这货大家应该都懂,不懂的请自动面壁思过,那么什么是JSONP,不是JSON放了个P就叫JSONP,而是JSON with Padding,在进行跨域请求的时候需要的数据,什么是 ...

随机推荐

  1. (转)javascript中return的作用

    这里面的return含有一些细节知识: 例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别 JAVASCRIPT在事件中调用函数 ...

  2. android 检查网络是否可用,如果不可用弹出设置,让用户改变

    /** * 校验网络,如果没有网络,返回true * * @return boolean */ @Override public boolean hasInternetConnected() { Co ...

  3. oracle遍历游标

    1,while循环 declare v_tname ); cursor c_tname is select a.TABLE_NAME from user_tables a where a.TABLES ...

  4. Struts2 模型驱动及页面回显

    * 要从页面中获取表单元素的值,需要在动作类中声明与页面元素同名的属性.导致动作类中既有javabean又有业务方法.        * 将javabean和业务方法进行分离:        * 将重 ...

  5. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  6. uva 482 - Permutation Arrays

    <int, double> --> <int, string> 从而避免了输出格式: #include <vector> #include <strin ...

  7. jsp页面间的传值

    很多的时候我们只是把我们需要的数据,查询出来,然后用request.setAttribute("" ,"" )方法保存这个数据集合.再在我们能跳转到的下一个js ...

  8. Java集合类笔试题

    介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...

  9. 工作流activiti-01个人小结

    最近公司需要开发工作流 使用的是activiti  个人拿着官方的User Guide 摸索了好几天 现做个小结: 对公司的小型OA开发一般用到如下几点: 1.依据客户业务得到业务流程图  可以是xm ...

  10. li的border无法和上边对齐

    如果利用border设置四周的border,如果一边的边框比较长无法对齐 解决办法: .test{ position: relative; border: 1px solid #808080; hei ...