[英]Sessions in Asp.NET MVC 4
誰能告訴我如何在asp.net MVC 4中處理會話。我知道此Session變量,並且知道如何使用它。
Session["login"] = true; //We can use it in controller to check the whether user logged in or not.
上面的代碼片段足以處理小型Web應用程序上的會話。 但是,如果我有許多控制器和動作,而我正在處理大型應用程序,在這種情況下,我將無法在每個動作中使用會話變量。
有什么通用的地方可以檢查會話變量或任何其他解決方案?
我曾經寫過一個Base Controller類,所有其他Controller都繼承自該類,需要在訪問之前進行身份驗證:
public class DefaultController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session["User"] == null)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult { Data = "LogOut", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
filterContext.Result = RedirectToAction("Login", "Account");
}
else
{
//base.Execute(filterContext.RequestContext);
}
}
}
並從Base Controller繼承用戶必須登錄的用戶:
public class LeaveController : DefaultController
{
}
另一種方法是編寫您自己的授權屬性。
這是自定義過濾器屬性的示例,創建從ActionFilterAttribute
繼承的類:
public class SessionTimeoutAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session["someValueYouLookFor"] == null)
{
filterContext.Result = new RedirectResult("~/Home/Index"); // redirect to login action
}
else
{
// continue normal execution
}
}
}
並將其放在Controller或Action上:
[SessionTimeout]
public ActionResult Index()
{
}
當然,如果您使用的是MVC 5,則可以使用身份驗證過濾器。
以最簡單的方式,您可以擁有一個baseController,所有其他控制器都應繼承該控制器,並且在baseController中,您可以覆蓋該OnActionExecuting事件,以驗證會話是否存在。
對於前。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Convert.ToBoolean(Session["login"]))
{
//Authenticated
}
else
{
//Kick to login page
}
}
所有其他控制器應繼承此baseController
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult Test()
{
return View();
}
}
這樣,在您的操作方法開始執行之前,將通過baseController的OnActionExecuting事件對其進行驗證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.