检测会话超时并在会话即将在mvc

时间:2016-09-22 08:27:10

标签: asp.net-mvc asp.net-mvc-4 session

当我的会话即将在.net Mvc。

中清除时,我必须显示一个弹出窗口

例如:enter link description here

我想在Mvc中使用同样的东西......我该怎么做???

这里我尝试了一些代码:

这是控制器页面(ClientScript不存在时出错):

   Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
        SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
        int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
        ClientScript.RegisterClientScriptBlock(this.GetType(),"SessionAlert", "SessionExpireAlert(" + timeout + ");", true);

这是我的视图(我从控制器调用):

<script type="text/javascript">
function SessionExpireAlert(timeout) {
    var seconds = timeout / 1000;
    document.getElementsByName("secondsIdle").innerHTML = seconds;
    document.getElementsByName("seconds").innerHTML = seconds;
    setInterval(function () {
        seconds--;
        document.getElementById("seconds").innerHTML = seconds;
        document.getElementById("secondsIdle").innerHTML = seconds;
    }, 1000);
    setTimeout(function () {
        //Show Popup before 20 seconds of timeout.
        $find("mpeTimeout").show();
    }, timeout - 20 * 1000);
    setTimeout(function () {
        window.location = "Expired.aspx";
    }, timeout);
};
function ResetSession() {
    //Redirect to refresh Session.
    window.location = window.location.href;
}
</script>

2 个答案:

答案 0 :(得分:2)

首先获取用户会话的超时时间:

int sessionTimeout = HttpContext.Current.Session.Timeout;
DateTime timeoutDate = DateTime.Now.AddMinutes(sessionTimeout);

您可以通过模型或ViewBag将其传递给您的视图,并使用javascript计时器弹出警报。 (由于会话在每次请求时都会刷新,这将是一个准确的超时)。

查看:

@{
    int milliseconds = (int)ViewBag.sessionTimeout * 60 * 1000;
}
setTimeout(function(){alert("SessionPop!");}, @milliseconds.ToString());

但是,由于会话在刷新控制器操作时会刷新,因此您可能希望提供实时支持(特别是如果您的应用程序将在多个选项卡中使用或大量使用AJAX调用)。您可以考虑使用SignalR在新会话超时到期时实时更新。

答案 1 :(得分:0)

AFAIK,MVC控制器在将脚本内容传递到视图时不需要ClientScript.RegisterClientScriptBlock。您只需使用ViewBag / ViewDataHtml.Raw注册脚本块,只需确保控制器返回包含ViewBag / ViewData的视图:

public ActionResult WarnTimeout()
{
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
    SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
    int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
    ViewBag.Script = "\r\n<script type='text/javascript'>\r\nSessionExpireAlert(" + timeout + ");\r\n</script>\r\n");

    return View();
}

// View (use Html.Raw to include script tag into view)
@Html.Raw(ViewBag.Script)

<script type="text/javascript">
function SessionExpireAlert(timeout) {
    var seconds = timeout / 1000;
    document.getElementsByName("secondsIdle").innerHTML = seconds;
    document.getElementsByName("seconds").innerHTML = seconds;
    setInterval(function () {
        seconds--;
        document.getElementById("seconds").innerHTML = seconds;
        document.getElementById("secondsIdle").innerHTML = seconds;
    }, 1000);
    setTimeout(function () {
        //Show Popup before 20 seconds of timeout.
        $find("mpeTimeout").show();
    }, timeout - 20 * 1000);
    setTimeout(function () {
        // when using MVC, you may use Url.Action instead of providing ASPX relative path
        window.location = "@Url.Action("Expired", "Controller")";
    }, timeout);
};
function ResetSession() {
    //Redirect to refresh Session.
    window.location = window.location.href;
}
</script>

或者,可以使用jQuery ajax调用($.ajax({ ... }))并提供某些数据,然后在success部分内设置所需的警报框操作。

欢迎任何建议。

参考类似问题:

How do I warn the user that their web session is about to time out?