小赵是刚毕业的计算机专业方面的大学生,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过期异常的处理的更多相关文章

  1. [转]菜鸟程序员之Asp.net MVC Session过期异常的处理

    本文转自:http://www.cnblogs.com/JustRun1983/p/3377652.html 小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动 ...

  2. Asp.net MVC Session过期异常的处理

    一.使用MVC中的Filter来对Session进行验证 (1)方法1: public class MyAuthorizeAttribute : FilterAttribute, IAuthoriza ...

  3. ASP.NET MVC Session 过期验证跳转至登入页面

    一.在要检查登入的控制器上继承 CheckLoginController 类 2. CheckLoginController 类的写法 using System; using System.Colle ...

  4. 《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  5. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  6. 判断asp.net中session过期的方法

    判断asp.net中session过期的方法 转载自:http://www.cnblogs.com/xilipu31/archive/2013/04/12/3016830.html 方法一:最麻烦也是 ...

  7. asp中设置session过期时间方法总结

    http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载   asp中默认session过期时间 ...

  8. asp.net mvc session锁问题

    一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...

  9. asp.net mvc session锁问题 (转载)

    一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...

随机推荐

  1. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  2. jquery选中下拉列表的某个值

    $('#villageToiletAnn').val('xxx'); id是select的ID,不是option的ID

  3. 通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)

    这是解决我之后上班地铁上看书问题的一个关键部分 一个手持电子设备,不大不小 一个方便做笔记的笔 一个方便做笔记的阅读器软件 方便快速地同步(只同步标记最好了) 在查看很多建议以及自己尝试之后,总结了这 ...

  4. Node.js爬虫抓取数据 -- HTML 实体编码处理办法

    cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时, ...

  5. 设置数据库为SINGLE_USER模式,减少锁定时间

    --SQL Server开启READ_COMMITTED_SNAPSHOT ----设置数据库为SINGLE_USER模式,减少锁定时间 ALTER DATABASE ENDV_SOA SET SIN ...

  6. innerHTML和outerHTML有什么区别

    一.区别:1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签.2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身. 二.例子1: & ...

  7. Scala underscore的用途

    _ 的用途 // import all import scala.io._ // import all, but hide Codec import scala.io.{Codec => _, ...

  8. 一、PBNI环境搭建及初步使用

    PowerBuilder Native Interface(PowerBuilder本机接口PBNI)允许将第3方程序转换为PowerBuilder对象,供PowerBuilder直接使用,也允许将P ...

  9. 获取用户的真实ip

    常见的坑有两个: 一.获取的是内网的ip地址.在nginx作为反向代理层的架构中,转发请求到php,java等应用容器上.结果php获取的是nginx代理服务器的ip,表现为一个内网的地址.php获取 ...

  10. 如何选择RabbitMQ的消息保存方式?

    RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram.如果采用disc,则需要对exchange/queue/delivery mode都要设置成durable模式. ...