问题
在使用CAS集成SSO的项目中,会遇到当CAS server session过期失效后,这时页面的所有ajax请求会出错。其原因是当前请求被判定为未授权,被CAS重定向到了 CAS LOGIN页面。但是AJAX无法处理这个问题。一般来说,会有下面的错误:
解决方案
解决方案有两个,但他们的基础都是修改CasDotNetClient的源代码,在SESSION失效的处理地方加上对AJAX请求的验证,然后针对AJAX请求SESSION失效的情况做特殊处理。
处理办法1:返回SESSION失效的JSON结果
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); } }
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:直接跳转到登陆页面
代码略