【问题标题】:Dealing with Session timeout in ASP.NET MVC处理 ASP.NET MVC 中的会话超时
【发布时间】:2016-03-27 20:42:44
【问题描述】:

我正在开发一个 MVC 应用程序,我需要通过根据查询字符串中的几个参数将用户重定向到不同的错误页面来处理错误和会话超时。

我面临的问题是我试图通过将查询字符串中的所需参数保存到会话中然后重定向到错误页面来实现这一点。但在我的控制器中的每个 HttpGet 和 Post 操作之前,我正在检查会话是否处于活动状态。

因此,在会话值丢失且无法读取它们的情况下。

我怎样才能以其他方式实现这个东西?

【问题讨论】:

标签: c# asp.net .net asp.net-mvc session


【解决方案1】:

您需要检查会话是否存在,是否具有您期望的字段并且处于活动状态。如果会话不存在或没有您期望的字段,则处理会话尚不存在/过期的情况。如果它不活动,则处理会话不再活动的情况。如果一切正常,则正常处理请求。如果会话过期,则按过期处理。

【讨论】:

  • 但我不是在寻找一种处理 Session 值为空的场景的方法,而是我想问是否有任何其他方式来存储用户相关数据
  • 您可以将用户相关数据存储在数据库中
【解决方案2】:

要检查会话,您可以像这样使用 ActionFilter:

public class SessionActiveFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var activeSession = Session["user"];
            if (activeSession == null)
                //Here, do a redirect

            base.OnActionExecuting(filterContext);
        }
    }

另外,您可以使用第三个选项来保存会话,例如 Redis Cache http://blogs.msdn.com/b/webdev/archive/2014/05/12/announcing-asp-net-session-state-provider-for-redis-preview-release.aspx

【讨论】:

    【解决方案3】:

    我现在知道这是一个死故事。但我为新来者发布了这个答案。请参阅 codeproject 中的精彩教程,了解如何在操作过滤器中检查会话值。

    在动态 Web 应用程序中,会话对于保存当前登录的用户身份/数据的信息至关重要。所以没有认证的人不能访问某个Page或者任何ActionResult,要实现这种功能,我们需要在每个需要认证的动作中检查session是否存在(不为null)。所以,一般方法如下:

    [HttpGet] 
    public ActionResult Home() 
    {
         if(Session["ID"] == null)
             return RedirectToAction("Login","Home"); 
    }
    

    我们每次都要在每个ActionResult中检查以上2条语句,但可能会导致2个问题。

    1. 重复事情:根据搁浅的优秀编程,我们不必重复事情。创建一个公共代码模块并多次/重复访问它
    2. 代码丢失:我们必须多次编写代码,所以有时我们可能会忘记以某种方法编写代码或错过它。

    如何避免?

    ASP.NET MVC 提供了一个非常棒的机制,即动作过滤器。动作过滤器是一个属性。您可以将大多数操作过滤器应用于单个控制器操作或整个控制器。 如果您想了解更多关于动作过滤器的信息,请click here

    因此我们将创建一个自定义操作过滤器来处理会话过期,如果会话为空,则重定向到登录操作。

    在您的项目中创建一个新类并复制以下代码:

    namespace YourNameSpace
    {
        public class SessionTimeoutAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                HttpContext ctx = HttpContext.Current;
                if (HttpContext.Current.Session["ID"] == null)
                {
                    filterContext.Result = new RedirectResult("~/Home/Login");
                    return;
                }
                base.OnActionExecuting(filterContext);
            }
        }
    }
    

    现在我们的动作过滤器已创建,我们可以使用它了。以下代码将向您展示我们如何将属性应用于 Action 或完成控制器。

    应用到操作

    [HttpGet]
    [SessionTimeout]
    public ActionResult MyProfile()
    {
        return View();
    }
    

    应用于控制器

    [SessionTimeout]
    public class HomeController : Controller
    {
    }
    

    现在 Home Controller 的所有动作都会在动作过滤器的帮助下检查会话。所以我们减少了代码和重复的东西。这就是动作过滤器的好处。

    【讨论】:

    • 如果您想要缩进代码,请选择代码并在 Stack Overflow 编辑器中单击 {}。不是>
    猜你喜欢
    • 2018-04-19
    • 2017-10-06
    • 2015-12-19
    • 2011-08-12
    • 2012-11-10
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多