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


    一、使用MVC中的Filter来对Session进行验证

    (1)方法1:

    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;
               }
    
          }
    }

    (2)方法二:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace GiftWeb.Controllers
    {
      
        public class BaseController : Controller
        {
    
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
    
                if (filterContext.HttpContext.Session["sysuserInfo"] == null)
                {
    
                    string currentUrl = filterContext.HttpContext.Request.RawUrl;
    
                    currentUrl = HttpUtility.UrlEncode(currentUrl);
    
                    filterContext.HttpContext.Response.Redirect("/Login/Index?returnUrl="+currentUrl);
                }
               
            }
    
        }
    }

    二、对于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过期异常的重要性

    说实话,开发人员开始项目的时候,往往关注在代码实现的功能上面,也就是程序"正常 "工作时候的状态关注的更多,而对于" 非正常 "情况下,考虑的很少。

    而对于这些方面的考虑,才能让我们成为更加专业的程序员,摆脱菜鸟的处境。

  • 相关阅读:
    Redis之String
    代码质量管理工具——SonarQube
    XML文件(2)--使用DOM4J示例
    XML文件(1)--使用DOM示例
    Maven之构件
    使用JS,获取URL中指定参数的值
    jQuery导入Eclipse后报错解决方法
    关于MySQL存储过程中遇到的一个错误
    学习MySQL之数据类型(四)
    jmeter直连数据库【转】
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/4587917.html
Copyright © 2020-2023  润新知