多站点,跨域进行登录或者传值问题<JSONP和jQuery.getJSON >

首先:理论知识:

JSONP定义:是一种跨域数据访问方式,非官方的协议。

作用与原理:在客户端声明 callback回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的JSON数据并动态执行回调函数。(这仅仅是JSONP简单的实现形式)。

劣势:

           第一:也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。

        第二:如果使用了不信任的服务会造成很大的安全隐患。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要

JSON:是一个轻量级的数据交换格式。

前台使用:
function GetReco() {
            var recommnum = $("#changnum").val();
            jQuery.getJSON("访问地址?jsoncallback=?", { num: recommnum, action: 'jobcategoryjson' }, function (json) {
               

            });
        }


后台方法:
string jsoncallback = Request.QueryString["jsoncallback"];
Response.Write(jsoncallback+"(json序列化对象)");

 其次:举例说明

关于登陆

在A站点登录,模拟登录B 、C站点

 第一:正常登录A站点后,返回 authKey 即:用户名@密码加密串,(密码guid)

 

jQuery.getJSON("$!GlobalInfo.ServerUrl_TeachPortal/B/Authentication/Login.aspx?jsoncallback=?", { "authKey": authKey }, function (json)
        {
            AuthenticationLoginB = json;
        });

jQuery.getJSON("$!GlobalInfo.ServerUrl_CourseResearch/C/Authentication/Login.aspx?jsoncallback=?", { "authKey": authKey }, function (json)
        {
            AuthenticationLoginC = json;
        });

在B 、C Login.aspx 页面代码

Controller Code
 1 public void Login(string authKey) 
2 {
3 try
4 {
5 CancelView();
6 string UserPwdMD5 = SysHelper.GetUserPwdMD5(authKey.Split('@')[0]);
7 if (authKey.Contains("@") && LoginHelper.CheckUserLoginAuthKey(authKey.Split('@')[0], UserPwdMD5, authKey))
8 {
9 SysHelper.AutoLogin("", authKey.Split('@')[0], UserPwdMD5, authKey.Split('@')[1].Substring(32));
10 Response.Write((Request.QueryString["jsoncallback"] ?? "") + "('Y');");
11 }
12 else
13 {
14 Response.Write((Request.QueryString["jsoncallback"] ?? "") + "('N');");
15 }
16 }
17 catch
18 {
19
20 Response.Write((Request.QueryString["jsoncallback"] ?? "") + "('N');");
21 }
22 }

当B 、C 站点登录成功后,返回Y,再次我们可以设置定时器,如果一次登录不成功,多次尝试登录,等返回Y即表示成功,有时网络不畅,尽管多次链接,未必成功,(jsonp劣势一)

View Code
 1 var i = 0 
2 var si = setInterval(function () {
3 if ((AuthenticationLoginB == "Y" && AuthenticationLoginC== "Y" ) || i >6)
4 {
5
6 clearInterval(si);
7 // 登录成功转向主页面
8 location.href = "/Default/Index.aspx";
9
10
11 }
12 i = i + 1;
13 }, 500);

到此 B 、 C 理论上,模拟登录成功。

关于 退出

在A 站点,退出后,恢复到登录界面,清除并重新设置cookie

 在B 、C站点 调用quit.aspx 页面代码

controller Code
1 [SkipFilter()] 
2 public void Quit()
3 {
4 CancelView();
5
6 SysHelper.Quit(); //清除并重新设置cookie
7 Response.Write((Request.QueryString["jsoncallback"] ?? "") + "('Y');");
8 }

 A 站点 可以尝试多次 退出

View Code
 1 jQuery.getJSON("$!GlobalInfo.ServerUrl_CourseResearch/Research/Authentication/Quit.aspx?jsoncallback=?", { "authKey": authKey }, function (json) 
2 {
3 AuthenticationQuitB = json;
4 });
5 jQuery.getJSON("$!GlobalInfo.ServerUrl_TeachPortal/Portal/Authentication/Quit.aspx?jsoncallback=?", { "authKey": authKey }, function (json)
6 {
7 AuthenticationQuitC = json;
8 });
9
10 var i = 0;
11 var sInterval = setInterval(function () {
12 if ((AuthenticationQuitB == "Y" && AuthenticationQuitC == "Y") || i > 4) {
13 clearInterval(sInterval);
14 //返回登录界面
15 location.href = "$!GlobalInfo.ServerUrl_UCenter/EmpInfor/Login.aspx";
16 }
17 i = i + 1;
18 }, 300);

 

posted @ 2012-03-31 18:41  365lei  阅读(2408)  评论(0编辑  收藏  举报