Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 639|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-26 15:20:11 | 显示全部楼层 |阅读模式

    小赵是刚毕业的计算机专业方面的大学生,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过期异常的重要性

    说实话,开发人员开始项目的时候,往往关注在代码实现的功能上面,也就是程序"正常"工作时候的状态关注的更多,而对于"非正常"情况下,考虑的很少。而对于这些方面的考虑,才能让我们成为更加专业的程序员,摆脱菜鸟的处境。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 21:09 , Processed in 0.052736 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表