在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录。一般情况下我们需要在多系统之间使用多个用户名和密码。这样客户就需要在多个系统之间重复登陆。每次登录都需要输入用户名和密码。最近比较流行的就是OAuth。新浪微博这个开放系统做的就很好。但OAuth并非本文讨论范畴。这里主要讨论jQuery1.5 jsonp 在Asp.net MVC3 中的应用。

本文应用场景:

假设您的开发团队欲为某集团公司开发一整套信息管理系统,目前首要开发的就是一套订单系统和一套内部OA系统。前提是这两套系统使用同一套数据库。只是两个不同的MVC3.0 Web项目。也就是说会在同一个IIS上部署两个虚拟目录。  我们的目标是在不使用WCF、WebService 等技术实现跨域登录。也就是说用户用同一个帐号登录了订单系统,那么客户就可以直接登录OA系统。而不需要在OA系统上再输入一次用户名和密码。反之亦成立。

jQuery1.5 JSONP 使用:

   <script type="text/javascript">
2 $(function () {
3 var oAUri = "@ViewBag.OAVRUri";
4 var user = "@ViewBag.User";
5 var pwd = "@ViewBag.PassWord";
6
7 $.ajax({
8 type: "GET",
9 url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd),
10 cache: false,
11 error: function () {
12 alert("程序出错,请联系管理员.");
13 },
14 dataType: "jsonp",
15 jsonp: 'callback',
16 success: function (result) {
17
18 }
19 });
20
21 });
22 </script>


在MVC3.0中建立JSONP专用ActionResult

代码如下:

 1 public class JsonpResult<T> : ActionResult
2 {
3 public T Obj { get; set; }
4 public string CallbackName { get; set; }
5
6 public JsonpResult(T obj, string callback)
7 {
8 this.Obj = obj;
9 this.CallbackName = callback;
10 }
11
12 public override void ExecuteResult(ControllerContext context)
13 {
14 var js = new System.Web.Script.Serialization.JavaScriptSerializer();
15 var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";
16
17 context.HttpContext.Response.ContentType = "application/json";
18 context.HttpContext.Response.Write(jsonp);
19 }
20 }

JsonpResult 简单调用如下:

 public ActionResult AppLogOn(string UserName, string PassWord, string callback)
{
return new JsonpResult<object>(new { success = true, rankName = rankName }, callback);
}

AppLogOn的action参数完全和上文中的jquery $.ajax 参数一致:

url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd)

小结:
Jsonp的服务器端的原理其实就是回调一个js函数名(这里是callback参数)将该参数传给服务端,接着再由服务器端执行这个callback js函数,
同时附上该js函数的参数。比如上文的C#代码:
var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";还有一点我们要注意的就是安全隐患问题:
在使用jsonp由于涉及到跨域,需要考虑到对方站点或者对方系统的安全性问题。应当避免安全隐患,不能滥用jsonp。

最新文章

  1. [转] Linux下 config/configure/Configure、make 、make test/make check、sudo make install 的作用
  2. 【C语言学习】《C Primer Plus》第7章 C控制语句:分支与跳转
  3. [你必须知道的.NET]第二十九回:.NET十年(上)
  4. Spring in action笔记
  5. 蓝牙音箱bose soundlink mini2链接mac后itunes自动启动的问题解决
  6. 关于团购VPS的事情报告
  7. JSTree如何实现第二级菜单异步从数据库读取。
  8. RHEL/Centos7 安装图形化桌面(转)
  9. centos7切换图像界面和dos界面
  10. 简单认识python(一)
  11. win 10 安装visual studio 2010
  12. 史上最全Spring面试71题与答案
  13. Socket网络编程--FTP客户端(2)(Windows)
  14. C语言基础:结构体 分类: iOS学习 c语言基础 2015-06-10 21:47 28人阅读 评论(0) 收藏
  15. Git小技巧:VIM中如何填写注释信息
  16. buildroot 文件系统添加telnet, ssh, 以及制作注意事项
  17. Spring Cloud中,Eureka常见问题总结
  18. GCC降级
  19. ubuntu下30天自制os 的学习计划
  20. Java中I/O流之Object流

热门文章

  1. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答
  2. Android--从零开始开发一款文章阅读APP
  3. Mysql 中 HAVING 和 USING 的使用
  4. Aptana插件在eclipse中安装
  5. cascade=CascadeType.ALL的深坑
  6. bootstrap学习笔记 插件概述
  7. android获取系统应用大小的方法
  8. springboot常见异常解决方案
  9. 网络中常见的ping命令协议
  10. Scroller应用:ListView滑动删除