小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了不少编程方面的数据,也动手也了不少代码。如今毕业了,他如愿的加入了T公司,开始了本身的程序员生涯。他信心满满,相信本身4年的学习到的东西,必定可以在工做派上用场,帮助本身很快的胜任如今的工做。html
阅读目录:程序员
1、Session引起的异常ajax
2、使用MVC中的Filter来对Session进行验证编程
3、对于Ajax请求的中,Session失效的处理session
4、处理Session过时异常的重要性ide
小赵刚进公司,就参与到了一个实际的项目中了,项目使用的是Asp.net MVC。花了大概2个周的时间,小赵就完成了全部功能,提交给QA测试了。学习
过了一天,QA发回了测试结果,小赵过了一遍,发现原来本身作的东西,里面问题这么多。测试
其中一个bug是这样的:url
使用Firefox登陆进入系统后,再打开一个Tab,进入系统页面,点击logout. 在回到前一个tab页面,点击Save按钮,出现了js错误。这个时候应当将用户转到登录页。spa
小赵看到这个bug,有些目瞪口呆,没想到QA用这么"暴力"的方式来测试本身的程序。在另外一个Tab上点击logout, 会致使session清空的,这样再点击第一个tab上的Save按钮,调用的Ajax方法会出现异常的。
可是如何处理这种”非正常”操做引起的异常呢?
小赵查了查资料,发现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请求,就返回特定格式的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; } } });
说实话,开发人员开始项目的时候,每每关注在代码实现的功能上面,也就是程序"正常"工做时候的状态关注的更多,而对于"非正常"状况下,考虑的不多。而对于这些方面的考虑,才能让咱们成为更加专业的程序员,摆脱菜鸟的处境。