我有一个ASP.NET MVC4应用程序,我正在实现sessionTimeout,如:
<configuration>
<system.web>
<sessionState timeout="2"></sessionState>
</system.web>
</configuration>
在身份验证中:
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="1" />
</authentication>
</system.web>
</configuration>
会话到期后(2分钟),我需要重定向到登录页面,但不会发生重定向。
如何更改代码以便重定向?
答案 0 :(得分:28)
一种方式是 如果会话过期,则必须在每个操作中检查其会话以及是否为空,然后重定向到“登录”页面。
但这是非常忙碌的方法
要完成此操作,您需要创建自己的ActionFilterAttribute
来执行此操作,您只需在每个操作方法中添加此属性。
这是覆盖ActionFilterAttribute的类。
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// check if session is supported
CurrentCustomer objCurrentCustomer = new CurrentCustomer();
objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer));
if (objCurrentCustomer == null)
{
// check if a new session id was generated
filterContext.Result = new RedirectResult("~/Users/Login");
return;
}
base.OnActionExecuting(filterContext);
}
}
然后在操作中添加此属性,如下所示:
[SessionExpire]
public ActionResult Index()
{
return Index();
}
这将使你工作。
答案 1 :(得分:23)
我发现在MVC中会话结束时重定向登录页面的非常简单的方法。我已经测试了它,这没有问题。
简而言之,我在1分钟之前的_Layout中捕获会话结束并进行重定向。
我试着一步一步地解释一切。
如果我们想在30分钟后结束会话并重定向到loginPage,请参阅以下步骤:
像这样更改网络配置(设置31分钟):
<system.web>
<sessionState timeout="31"></sessionState>
</system.web>
在_Layout
中添加此JavaScript(当此代码重定向前1分钟会话结束时,它会在用户上次操作后计算时间,而不是首次访问网站)
<script>
//session end
var sessionTimeoutWarning = @Session.Timeout- 1;
var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
setTimeout('SessionEnd()', sTimeout);
function SessionEnd() {
window.location = "/Account/LogOff";
}
</script>
这是我的LogOff Action,它只生成LogOff并重定向LoginIn Page
public ActionResult LogOff()
{
Session["User"] = null; //it's my session variable
Session.Clear();
Session.Abandon();
FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication
return RedirectToAction("Login", "Account");
}
我希望这对你来说是一个非常有用的代码。
答案 2 :(得分:5)
有一个通用解决方案:
假设您有一个名为Admin的控制器,您可以为授权用户放置内容。
然后,您可以覆盖管理员的 Initialize
或OnAuthorization
方法,并在会话超时时将重定向写入登录页面逻辑,如下所述:
protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
//lets say you set session value to a positive integer
AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]);
if (AdminLoginType == 0)
{
filterContext.HttpContext.Response.Redirect("~/login");
}
base.OnAuthorization(filterContext);
}