使用 jsonp 实现 多站点 单点登录
<script type="text/javascript"> $(function () { var oAUri = "@ViewBag.OAVRUri"; var user = "@ViewBag.User"; var pwd = "@ViewBag.PassWord"; $.ajax({ type: "GET", url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?',oAUri,user,pwd), cache: false,11 error: function () {
alert("程序出错,请联系管理员."); }, dataType: "jsonp", jsonp: 'callback', success: function (result) { } }); }); </script>
代码如下: 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); } } 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=?',pwd) 小结: Jsonp的服务器端的原理其实就是回调一个js函数名(这里是callback参数)将该参数传给服务端, 接着再由服务器端执行这个callback js函数,同时附上该js函数的参数。 比如上文的C#代码:var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")"; 还有一点我们要注意的就是安全隐患问题:在使用jsonp由于涉及到跨域,需要考虑到对方站点或者对方系统的安全性问题。 应当避免安全隐患,不能滥用jsonp (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |