菜鸟程序员之Asp.net MVC Session过期异常的处理
小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动手也了很多代码。现在毕业了,他如愿的加入了T公司,开始了自己的程序员生涯。他信心满满,相信自己4年的学习到的东西,一定能够在工作派上用场,帮助自己很快的胜任现在的工作。
阅读目录:
一、Session引发的异常
二、使用MVC中的Filter来对Session进行验证
三、对于Ajax请求的中,Session失效的处理
四、处理Session过期异常的重要性
一, 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;
}
}
});
四, 处理Session过期异常的重要性
说实话,开发人员开始项目的时候,往往关注在代码实现的功能上面,也就是程序"正常"工作时候的状态关注的更多,而对于"非正常"情况下,考虑的很少。而对于这些方面的考虑,才能让我们成为更加专业的程序员,摆脱菜鸟的处境。
菜鸟程序员之Asp.net MVC Session过期异常的处理的更多相关文章
- [转]菜鸟程序员之Asp.net MVC Session过期异常的处理
本文转自:http://www.cnblogs.com/JustRun1983/p/3377652.html 小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动 ...
- Asp.net MVC Session过期异常的处理
一.使用MVC中的Filter来对Session进行验证 (1)方法1: public class MyAuthorizeAttribute : FilterAttribute, IAuthoriza ...
- ASP.NET MVC Session 过期验证跳转至登入页面
一.在要检查登入的控制器上继承 CheckLoginController 类 2. CheckLoginController 类的写法 using System; using System.Colle ...
- 《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- 判断asp.net中session过期的方法
判断asp.net中session过期的方法 转载自:http://www.cnblogs.com/xilipu31/archive/2013/04/12/3016830.html 方法一:最麻烦也是 ...
- asp中设置session过期时间方法总结
http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载 asp中默认session过期时间 ...
- asp.net mvc session锁问题
一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...
- asp.net mvc session锁问题 (转载)
一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...
随机推荐
- HTML的学习
PS:最近已经进入实验室了,已经算是正式的成为其中的核心成员了,虽然自己学习的并不多.但是 相信自己通过努力能够走的越来越好.条件还是蛮不错的.这次给了一个关于WEB的项目,自己的还是 没有学完JAV ...
- Spring基础—— 在 Spring Config 中使用外部属性文件
一.在 Spring Config 文件中配置 Bean 时,有时候需要在 Bean 的配置里添加 系统部署的细节信息, 如文件路径,数据源配置信息.而这些部署细节实际上需要在配置文件外部来定义. 二 ...
- Gradle学习系列之二——创建Task的多种方法
在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***.
Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***. Mongodb是一种面向文档的 ...
- Identity标识列
SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便.但它有时还会带来一些麻烦. 示例一 :当表中被删除了某些数据的时候,自增长列的编号就不再是一个连线的数 ...
- C#语言各种集合介绍
集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)一个集合包括多个元素,即有一个集合类对象和N个元素对象 因为任何集合类都实现了IEnumerable接口,所以任何集 ...
- Titanium开发环境搭建第三个坑
Nodejs版本的问题 首先,如下引用:http://docs.appcelerator.com/titanium/latest/#!/guide/Installing_Node To run all ...
- [译]PrestaShop开发者指南 第一篇 基础
# 第一篇 基础 PS(PrestaShop简称)一开始就设定了能够在它的基础上很简单的构建第三方模块的机制,让它成为一款具有极高定制性的电子商务软件. PS的可以在三个方面进行定制: * 主题 * ...