处理ASP.NET MVC中的会话超时

时间:2015-12-21 17:36:21

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

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

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

因此,如果会话值丢失且无法读取它们。

我怎样才能以任何其他方式实现这一点?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

要检查会话,您可以使用这样的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

答案 2 :(得分:0)

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

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

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

我们每次必须在每个ActionResult中检查上述2条语句,但这可能会导致2个问题。

  1. 重复操作:根据良好的编程习惯,我们不必重复操作。创建通用代码模块并多次/重复访问
  2. 代码丢失:我们必须多次编写代码,因此有时可能会忘记用某种方法编写代码,或者我们错过了。

如何避免?

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

因此,我们将创建一个自定义的操作筛选器来处理会话到期,如果session为null,则重定向到Login Action。

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

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上的所有动作都将在会话中进行检查。因此,我们减少了代码和重复的事情。这就是动作过滤器的优点。