Ajax调用时,会话超时 [英] Ajax call when session time out

查看:107
本文介绍了Ajax调用时,会话超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有的,我想重定向到登录页面,如果做一个Ajax调用时,会话超时。 以下是我迄今为止做的。

定义一个动作过滤器为所有的行动。

 公共类AuthenticateFilterAttribute:ActionFilterAttribute
    {
        公众覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            VAR routeDataSet = filterContext.RouteData;
            如果(LoginUser.LoginAdministrator == NULL)
            {
                //如果存放在会话中的useinfo超时。
                如果(routeDataSet!= NULL
                    &功放;&安培; routeDataSet.Values​​ [控制器]!= NULL
                    &功放;&安培; routeDataSet.Values​​ [控制器。toString()方法。TOLOWER()。等于(登录)
                    &功放;&安培; routeDataSet.Values​​ [行动]!= NULL
                    &功放;&安培; routeDataSet.Values​​ [行动]的ToString()。TOLOWER()。等于(登录))
                {
                    //如果登录操作itself.let这样。没有做任何事情。


                }
                其他
                {
                    //重定向到登录页面。
                    filterContext.Result =新RedirectToRouteResult(
                        新RouteValueDictionary {{控制器,登录},{行动,登录}});
                }
            }
        }
    }
 

这适用于非AJAX的行动电话时,会话超时。但对于Ajax调用。这不能不是重定向到登录页面,但只返回一个HTML页面的字符串(似乎是HTML源文件code为登录页),而不是真正的结果。 假设我们有code这样的。

 函数ajaxGetLogDetail(LOGID){
        VAR SURL =/设置logdetail /指数LOGID =?+ LOGID;
        $阿贾克斯({
            缓存:假的,
            键入:GET,
            异步:假的,
            网址:SURL,
            成功:函数(结果){
                //请注意,结果是HTML字符串。不是真正的结果。
            },
            错误:函数(XHR){
                警报(xhr.responseText);
            }
        });
    }
 

谁能帮给我一些线索来解决这个问题?谢谢。

更新

根据的穆赫辛和戴夫的回答(感谢你们两个),这是最终的解决方案。请审查。谢谢。

 公共类AuthenticateFilterAttribute:ActionFilterAttribute
    {
        公众覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            VAR routeDataSet = filterContext.RouteData;
            如果(LoginUser.LoginAdministrator == NULL)
            {

                //&功放;&安培; routeDataSet = NULL和放大器;!&安培; routeDataSet.Values​​ [控制器]!= NULL
                //&功放;&安培; !。routeDataSet.Values​​ [控制器]的ToString()TOLOWER()等于(登录)及和放大器; routeDataSet.Values​​ [行动]!= NULL
                //&功放;&安培; !。routeDataSet.Values​​ [行动]的ToString()TOLOWER()等于(登录)及和放大器; !filterContext.HttpContext.Request.HttpMethod.ToLower()。等于(得))
                如果(routeDataSet!= NULL
                    &功放;&安培; routeDataSet.Values​​ [控制器]!= NULL
                    &功放;&安培; routeDataSet.Values​​ [控制器。toString()方法。TOLOWER()。等于(登录)
                    &功放;&安培; routeDataSet.Values​​ [行动]!= NULL
                    &功放;&安培; routeDataSet.Values​​ [行动]的ToString()。TOLOWER()。等于(登录))
                {



                }
                其他
                {
                    如果(filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result =新JsonResult
                        {
                            数据=新
                            {
                                的ErrorMessage =SystemSessionTimeOut
                            },
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet
                        };
                    }
                    其他
                    {
                        filterContext.Result =新RedirectToRouteResult(
                            新RouteValueDictionary {{控制器,登录},{行动,登录}});
                    }
                }
            }
        }
    }
 

在客户端:

 函数ajaxGetLogDetail(LOGID){
        VAR SURL =/设置logdetail /指数LOGID =?+ LOGID;
        $阿贾克斯({
            缓存:假的,
            键入:GET,
            异步:假的,
            网址:SURL,
            成功:函数(结果){
                如果(result.ErrorMessage ==SystemSessionTimeOut)
                {
                   windows.location =/登录/登录;
                }
                其他
                {
                   // ...
                }
            },
            错误:函数(XHR){
                警报(xhr.responseText);
            }
        });
    }
 

解决方案

Ajax调用不能返回任何形式的重定向。在核心AJAX调用只返回一个字符串。还有,将执行重定向的那种没有引擎。

您可以执行客户端重定向,但。如果会话超时,并在客户端有你的控制器方法返回false:

 如果!(routeDataSet!= NULL
         &功放;&安培; routeDataSet.Values​​ [控制器]!= NULL
         &功放;&安培; routeDataSet.Values​​ [控制器。toString()方法。TOLOWER()。等于(登录)
         &功放;&安培; routeDataSet.Values​​ [行动]!= NULL
         &功放;&安培; routeDataSet.Values​​ [行动]的ToString()。TOLOWER()。等于(登录))
      {
        返回JSON(新{成功=假的,消息的errorMessage =});
      }
 

在你的AJAX 错误功能:

 错误:函数(XHR){
            警报(xhr.responseText);
            了window.location ='/登录/登录;
        }
 

边注:是您的目的地意思是'/登录/登录或/帐号/登录

All, I am trying to redirect to login page if making a ajax call when session timeout. Here is what I had done so far.

Define a action filter for all the action.

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {
                //if the useinfo stored in session is timeout. 
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {
                    //if it is login action itself.let it be. don't do anything.


                }
                else
                {
                    //redirect to login page.
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                }
            }
        }
    }

This works for non ajax action call when session time out. But for the ajax call. It can't not redirect to login page but only return a html page string(seems it is the source html code for login page), not the really result. Say we have code like this.

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                //please note result is html string. not the really result.
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

Could anyone help to give me some clue for solving this issue? thanks.

Updated

Based on the Mohsin and Dave's answer(thanks you two), Here is the finally solution. Please review it. thanks.

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {

                //&& routeDataSet != null && routeDataSet.Values["controller"] != null
                //&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null
                //&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {



                }
                else
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result = new JsonResult
                        {
                            Data = new
                            {
                                ErrorMessage = "SystemSessionTimeOut"
                            },
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet
                        };
                    }
                    else
                    {
                        filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                    }
                }
            }
        }
    }

On the client side :

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                if (result.ErrorMessage=="SystemSessionTimeOut")
                {
                   windows.location="/Login/Login";
                } 
                else
                {
                   //...  
                }
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

解决方案

Ajax calls CANNOT return a redirect of any kind. At core an AJAX call only returns a string. There is no Engine of the kind that will perform a redirect.

You CAN perform a client side redirect though. If the Session has timed out and on client side have your Controller Method return false:

     if !(routeDataSet != null
         && routeDataSet.Values["controller"] != null
         && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
         && routeDataSet.Values["action"] != null
         && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
      {
        return Json(new { success = false, message = errorMessage });
      }

In your AJAX error function:

        error: function (xhr) {
            alert(xhr.responseText);
            window.location='/Login/Login';
        }

Side note: was your destination meant to be '/Login/Login' or '/Account/Login'

这篇关于Ajax调用时,会话超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆