多站点,跨域进行登录或者传值问题<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);

优质内容筛选与推荐>>
1、ajax+json+Struts2实现list传递
2、单例模式
3、MySql 基本语法_数据库操作
4、引水入城——重新做一遍,原来真的水
5、生产者模式实现总结1


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn