C# ASP.NET MVC中会话超时的处理
我正在开发一个MVC应用程序,我需要根据查询字符串中的几个参数将用户重定向到不同的错误页面,从而处理错误和会话超时 我面临的问题是,我试图通过将querystring中所需的参数保存到会话中,然后重定向到错误页面来实现这一点。但在控制器中的每个HttpGet和Post操作之前,我都会检查会话是否处于活动状态 因此,在会话值丢失且无法读取的情况下C# ASP.NET MVC中会话超时的处理,c#,asp.net,.net,asp.net-mvc,session,C#,Asp.net,.net,Asp.net Mvc,Session,我正在开发一个MVC应用程序,我需要根据查询字符串中的几个参数将用户重定向到不同的错误页面,从而处理错误和会话超时 我面临的问题是,我试图通过将querystring中所需的参数保存到会话中,然后重定向到错误页面来实现这一点。但在控制器中的每个HttpGet和Post操作之前,我都会检查会话是否处于活动状态 因此,在会话值丢失且无法读取的情况下 如何以任何其他方式实现这一点?您需要检查会话是否存在,是否具有所需的字段以及是否处于活动状态。如果会话不存在或没有预期的字段,则处理会话不存在/过期的情
如何以任何其他方式实现这一点?您需要检查会话是否存在,是否具有所需的字段以及是否处于活动状态。如果会话不存在或没有预期的字段,则处理会话不存在/过期的情况。如果未处于活动状态,则在会话不再处于活动状态时处理该情况。如果一切正常,则正常处理请求。如果会话已过期,则将其处理为已过期。要检查会话,您可以使用如下操作筛选器:
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我知道这是一个死故事。但我为新来者发布了这个答案。请参阅中关于如何在操作筛选器中检查会话值的nice教程 在动态web应用程序中,会话对于保存当前登录用户身份/数据的信息至关重要。因此,没有身份验证的人无法访问某个页面或任何ActionResult,要实现这种功能,我们需要检查每个需要身份验证的操作中是否存在会话(不为空)。因此,一般方法如下:
[HttpGet]
public ActionResult Home()
{
if(Session["ID"] == null)
return RedirectToAction("Login","Home");
}
我们每次都要检查上面的2条语句,并且在每个ActionResult中都要检查,但这可能会导致2个问题
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);
}
}
}
现在我们的动作过滤器已经创建,我们已经准备好使用它了。下面的代码将向您展示如何将属性应用于操作或完成控制器
应用于行动
[HttpGet]
[SessionTimeout]
public ActionResult MyProfile()
{
return View();
}
应用于控制器
[SessionTimeout]
public class HomeController : Controller
{
}
现在,家庭控制器的所有动作将在动作过滤器的帮助下检查会话。因此,我们减少了代码和重复的事情。这就是操作过滤器的好处。但我不是在寻找一种处理会话值为null的场景的方法,而是想问是否有其他方法存储用户相关数据。您可以将用户相关数据存储在数据库中签出TempData如果您想要缩进代码,请选择代码并单击
{}
在堆栈溢出编辑器中。不是
。