Asp.net MVC Session過期異常的處理
阿新 • • 發佈:2019-01-10
一, Session引發的異常
小趙剛進公司,就參與到了一個實際的專案中了,專案使用的是Asp.net MVC。花了大概2個周的時間,小趙就完成了所有功能,提交給QA測試了。
過了一天,QA發回了測試結果,小趙過了一遍,發現原來自己做的東西,裡面問題這麼多。
其中一個bug是這樣的 :
使用Firefox登入進入系統後,再開啟一個Tab,進入系統頁面,點選logout. 在回到前一個tab頁面,點選Save按鈕,出現了js錯誤。這個時候應當將使用者轉到登陸頁。
小趙看到這個bug,有些目瞪口呆,沒想到QA用這麼"暴力"的方式來測試自己的程式。在另一個Tab上點選logout, 會導致session清空的,這樣再點選第一個tab上的Save按鈕,呼叫的Ajax方法會出現異常的。
但是如何處理這種”非正常”操作引發的異常呢?
二,使用MVC中的Filter來對Session進行驗證
小趙查了查資料,發現MVC中的 AuthorizationFilter 能夠在實際訪問Controller前,攔截請求,這個時候在這裡可以對Session的有效性進行檢查,如果發現Session失效了,就把使用者轉向登陸頁。(關於MVC filter可以點這裡)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(redirectUrl);
return;
}
}
}
三,對於Ajax請求的中,Session失效的處理
Ajax請求中,如果遇到session過期,使用上面的方法是不能夠達到效果的。實現的思路是,如果發現是Ajax請求,就返回 特定格式的Json資料 ,客戶端對於這個資料進行處理,發現有Session失效的情況,就跳轉到登入頁面。
首先,擴充套件我們的MyAuthorizeAttribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { var loginUser = filterContext.HttpContext.Session["User"]; //When user has not login yet if (loginUser == null) { var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url; if(!filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new RedirectResult(redirectUrl); } else { filterContext.Result = new JsonResult { Data = new { Success = false, Message = string.Empty, Redirect = redirectUrl } }; } return; } }
上面判斷如果請求是來自於Ajax, 就返回一個Json Result,客戶端處理的程式碼如下:
$.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});