多站点,跨域进行登录或者传值问题<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 页面代码
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劣势一)
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 页面代码
1 [SkipFilter()]
2 public void Quit()
3 {
4 CancelView();
5
6 SysHelper.Quit(); //清除并重新设置cookie
7 Response.Write((Request.QueryString["jsoncallback"] ?? "") + "('Y');");
8 }
A 站点 可以尝试多次 退出
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);