对于用户登录后将数据存储到session中,但是对于session过期引发的异常,会导致很多程序崩溃,或数据不对。所以正对于session过期处理,势在必行。
1.在一些数据持久化的操作中,我们会使用一些session中的数据,向后台进行数据持久化,但是如果session中没有数据的话,会出现很多意想不到的错误。(一般的session过期)
使用MVC中的Filter来对Session进行验证:MVC中的 AuthorizationFilter 能够在实际访问Controller前,拦截请求,这个时候在这里可以对Session的有效性进行检查,如果发现Session失效了,就把用户转向登陆页
代码如下:
1 public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 2 { 3 public void OnAuthorization(AuthorizationContext filterContext) 4 { 5 var loginUser = filterContext.HttpContext.Session["User"]; 6 //当session过期的时候,进行跳转 7 if (loginUser == null) 8 { 9 var redirectUrl = ""; //跳转的地址10 filterContext.Result = new RedirectResult(redirectUrl); 11 return; 12 } 13 } 15 }
2.对于Ajax请求的中,Session失效的处理:如果发现是Ajax请求,就返回 特定格式的Json数据 ,客户端对于这个数据进行处理,发现有Session失效的情况,就跳转到登录页面。
代码如下:
1 public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 2 { 3 public void OnAuthorization(AuthorizationContext filterContext) 4 { 5 var loginUser = filterContext.HttpContext.Session["User"]; 6 //When user has not login yet 7 if (loginUser == null) 8 { 9 var redirectUrl = ""; //跳转的地址 10 if(!filterContext.HttpContext.Request.IsAjaxRequest()) 11 { 12 filterContext.Result = new RedirectResult(redirectUrl); 13 } 14 else 15 { 16 filterContext.Result = new JsonResult 17 { 18 Data = new 19 { 20 Success = false, 21 Message = string.Empty, 22 Redirect = redirectUrl 23 } 24 }; 25 } 26 return; 27 } 28 }
客户端的js代码如下:
1 $.ajax({ 2 type: "POST", 3 url: "url", 4 success: function (msg) { 5 if (msg.Success) { 6 ……. 7 } 8 if (msg.Redirect) { 9 window.location = msg.Redirect; 10 } 11 } 12 });