我现在知道这是一个死故事。但我为新来者发布了这个答案。请参阅 codeproject 中的精彩教程,了解如何在操作过滤器中检查会话值。
在动态 Web 应用程序中,会话对于保存当前登录的用户身份/数据的信息至关重要。所以没有认证的人不能访问某个Page或者任何ActionResult,要实现这种功能,我们需要在每个需要认证的动作中检查session是否存在(不为null)。所以,一般方法如下:
[HttpGet]
public ActionResult Home()
{
if(Session["ID"] == null)
return RedirectToAction("Login","Home");
}
我们每次都要在每个ActionResult中检查以上2条语句,但可能会导致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 的所有动作都会在动作过滤器的帮助下检查会话。所以我们减少了代码和重复的东西。这就是动作过滤器的好处。