CAS .NET client中对于ajax请求Session失效的处理
问题在使用CAS集成SSO的项目中,会遇到当CAS server session过期失效后,这时页面的所有ajax请求会出错。其原因是当前请求被判定为未授权,被CAS重定向到了 CAS LOGIN页面。但是AJAX无法处理这个问题。一般来说,会有下面的错误: 解决方案解决方案有两个,但他们的基础都是修改CasDotNetClient的源代码,在SESSION失效的处理地方加上对AJAX请求的验证,然后针对AJAX请求SESSION失效的情况做特殊处理。 处理办法1:返回SESSION失效的JSON结果找到CasDotNetClient处理重定向的代码:
修改代码如下: public static void RedirectToLoginPage(bool forceRenew) { Initialize(); HttpContext context = HttpContext.Current; HttpResponse response = context.Response; //判断当前请求是否为ajax请求 if (context.Request.Headers["X-Requested-With"] != null && context.Request.Headers["X-Requested-With"].ToLower() == "xmlhttprequest") { //如果是则返回sessionlost的json结果 response.Clear(); response.ContentType = "application/Json"; response.StatusCode = 401; response.Write("{"sessionlost": "true"}"); } else { string redirectUrl = UrlUtil.ConstructLoginRedirectUrl(false,forceRenew); protoLogger.Info("Redirecting to " + redirectUrl); response.Redirect(redirectUrl,false); } } 然后在js文件中的ajax错误全局处理函数中加入: javascript$(document).ajaxError(function(evt,xhr) { try { var json = JSON.parse(xhr.responseText); if (json.sessionlost) { message.showError('登陆超时,即将刷新当前页面,如果没有刷新,请手动刷新当前页面。',"登陆超时"); //当session失效后,等待2秒刷新当前页面 setTimeout("location.reload();",2000); } else { message.showError(json.errorMessage,"错误"); } } catch (e) { console.log(e); message.showError("系统内部错误ajaxError。","错误"); } }); 其他地方不需要修改,这样当一个ajax请求在Session失效的情况下发出后,CAS会返回401,进而会被认为请求失败,进入ajaxError处理函数, 在这里加入对sessionlost的判断,如果是sessionlost则提示并刷新当前页面,刷新当前页面会因为sessionlost而跳转到CAS登陆页面。 处理办法2:直接跳转到登陆页面
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |