问题
在使用CAS集成SSO的项目中,会遇到当CAS server session过期失效后,这时页面的所有ajax请求会出错。其原因是当前请求被判定为未授权,被CAS重定向到了 CAS LOGIN页面。但是AJAX无法处理这个问题。一般来说,会有下面的错误:
解决方案
解决方案有两个,但他们的基础都是修改CasDotNetClient的源代码,在SESSION失效的处理地方加上对AJAX请求的验证,然后针对AJAX请求SESSION失效的情况做特殊处理。
处理办法1:返回SESSION失效的JSON结果
找到CasDotNetClient处理重定向的代码:
CasAuthentication.cs文件中第518行的RedirectToLoginPage方法
修改代码如下:
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:直接跳转到登陆页面
代码略
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。