1. 程式人生 > >mvc下ajax請求遇到session超時簡單處理方式

mvc下ajax請求遇到session超時簡單處理方式

(第一次寫部落格,有點糙,大家湊合著看吧 ==)
這兩天開發遇到有一個問題,ajax請求遇到session超時只返回登陸頁的html,我原來的頁面跳轉程式碼是這樣的:

/// <summary>
        /// 重寫基類在Action執行之前的事情
        /// </summary>
        /// <param name="filterContext">重寫方法的引數</param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //得到使用者登入的資訊
CurrentUserInfo = Session["UserInfo"] as Comm_Operator; //判斷使用者是否為空 if (CurrentUserInfo == null) { //以下兩句程式碼無法徹底截斷請求、還會繼續請求原來的action //filterContext.HttpContext.Response.Redirect("/Login/Index"); //filterContext.HttpContext.Response.End();
//下面的程式碼可以截斷原來的action請求 filterContext.Result = RedirectToRoute("Default", new { Controller = "Login", Action = "Index" }); } base.OnActionExecuting(filterContext); }

專案採用的是mvc模式,上面程式碼簡單來說就是寫了一個基類控制器,然後所有的控制器都繼承這個基類控制器,基類控制器中重寫了OnActionExecuting方法,然後方法中判斷當前登入資訊是否為空,為空則跳轉至登陸頁,問題來了,就像我剛才說的,如果是正常的請求這裡會跳轉到登陸頁,但如果是ajax請求就只會返回登陸頁的html無法跳頁面,我想要實現的效果是:所有的ajax請求如果發現session超時前臺就跳頁面,找了挺多資料都好像說前臺對ajax請求進行統一封裝,統一攔截處理,但我的專案已經完成了,這樣的地方太多了,如果所有都要改想想都覺得麻煩,參考了一些資料後找到了相對簡單的處理方式,上程式碼!

基類控制器:

 /// <summary>
        /// 重寫基類在Action執行之前的事情
        /// </summary>
        /// <param name="filterContext">重寫方法的引數</param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //得到使用者登入的資訊
            CurrentUserInfo = Session["UserInfo"] as Comm_Operator;
            //判斷使用者是否為空
            if (CurrentUserInfo == null)
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    Response.AppendHeader("sessionstatus", "timeout");
                    Response.End();
                }
                else
                {
                    //以下兩句程式碼無法徹底截斷請求、還會繼續請求原來的action
                    //filterContext.HttpContext.Response.Redirect("/Login/Index");
                    //filterContext.HttpContext.Response.End();

                    //下面的程式碼可以截斷原來的action請求
                    filterContext.Result = RedirectToRoute("Default", new { Controller = "Login", Action = "Index" });
                }
            }
            else
                base.OnActionExecuting(filterContext);
        }

其實就是在之前的基礎上添加了對ajax請求的判斷。
前端公用js中新增:

//全域性的ajax訪問,處理ajax清求時sesion超時
    $.ajaxSetup({
        contentType: "application/x-www-form-urlencoded;charset=utf-8",
        complete: function (XMLHttpRequest, textStatus) {
            //通過XMLHttpRequest取得響應頭,sessionstatus,
            var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
            if (sessionstatus == "timeout") {
                //如果超時就處理 ,指定要跳轉的頁面
                window.location = "/Login/Index";
            }
        }
    });

到此,我想要的功能就完成了。