zoukankan      html  css  js  c++  java
  • 菜鸟程序员之Asp.net MVC 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;
                          }
            }
    });     


    另一种方式
    //ajax
                    if (context.Request.IsAjaxRequest())
                    {
                        //http://www.jeasyui.com/forum/index.php?topic=584.0
                        //http://www.iteye.com/problems/70335
                        //直接返回403,然后客户端判断,并添加SessionTimeout头
                        context.Response.AddHeader("SessionTimeout""true");
                        filterContext.Result = new HttpStatusCodeResult(403, "您没有该权限,请登录!");
                        return;
                    }

    在客户端,使用jquery捕获错误
    1
    2
    3
    4
    5
    $(document).ajaxError(function (event, jqXHR) {
                    if (jqXHR.status === 403 && jqXHR.getResponseHeader('SessionTimeout') === 'true') {
                        window.top.location.href = '@Url.Action("LogIn", "Home")';
                    }
                });
  • 相关阅读:
    jsp三种注释方法
    MyEclipse 2015优化技巧
    查看是否安装jdk及路径
    hibernate中save()、get()、load()、update()、saveorupdate()、merge()等方法
    MyEclipse更改项目名web发布名字不改问题
    try-catch-finally try中有rerun 是否执行finally
    使用HTML制作网页
    rs(0)与rs("字段名")的区别
    金蝶K3 wise 插件二次开发与配置
    初识触发器(2)
  • 原文地址:https://www.cnblogs.com/sjqq/p/7608904.html
Copyright © 2011-2022 走看看