对于用户登录后将数据存储到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 });