CAS .NET client中对于ajax请求Session失效的处理

前端之家收集整理的这篇文章主要介绍了CAS .NET client中对于ajax请求Session失效的处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

问题

在使用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:直接跳转到登陆页面

代码

猜你在找的Ajax相关文章