mvc下ajax請求遇到session超時簡單處理方式
阿新 • • 發佈:2019-01-26
(第一次寫部落格,有點糙,大家湊合著看吧 ==)
這兩天開發遇到有一個問題,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";
}
}
});
到此,我想要的功能就完成了。