【问题标题】:How to redirect after session timeout in MVC .Net?如何在 MVC .Net 中的会话超时后重定向?
【发布时间】:2018-01-29 05:32:59
【问题描述】:

我想在 2 分钟不活动后重定向我的页面,为此我使用以下代码每 2.5 分钟 ping 一次控制器,如果会话已过期,我将重定向到原始登录页面:

`<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script language="javascript" type="text/javascript">
    var ReqTime =@Session.Timeout
        ReqTime = ReqTime * 60 * 1000 + (.5 * 60 * 1000);
    $(function () {
    setInterval(CheckSession, ReqTime);
});

function CheckSession() {
    $.post('@Url.Action("SessionInfo","Home")', null, function () {
        console.log("Time");
    });
}
</script>

控制器:

 public ActionResult SessionInfo()
    {

        if (Session["LoginUserName"]==null)
        {
             return RedirectToAction("Index","Home");
        }


    }

此代码不会重定向到主页/索引。你能告诉我哪里出错了吗?

【问题讨论】:

  • 您是否检查了浏览器控制台和网络选项卡,是否有任何错误?通话正在进行吗?
  • 您正在返回 $post 上 index home 的内容。如果你打印它的结果,你会注意到它
  • 没有错误。即使在调试模式下,控件似乎也命中了 RedirectToAction("Index","Home")。但不会发生重定向。谢谢@PSK
  • @DianaYsabel 你是对的。你能推荐一个替代重定向的方法吗?

标签: c# jquery .net asp.net-mvc session-timeout


【解决方案1】:

尝试使用 Javascript,因为从服务器端重定向需要回发

您可以通过控制器检查会话并返回一个值以确定会话是否结束

 function CheckSession() {
    $.ajax({
        type: "GET",
        url: "@Url.Action("SessionInfo", "Home")"
    }).done(function (data) {
        if (data === true) {
            window.location.href = "@Url.Action("Index", "Home")";
        }
    }).fail(function (e) {
        alert('Error');
    });
}

控制器

public JsonResult SessionInfo()
        {

            if (Session["LoginUserName"] == null)
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            return Json(false, JsonRequestBehavior.AllowGet);
        }

这段代码解释

【讨论】:

  • 嗨,@Ahmed,我的浏览器控制台显示内部服务器错误,我可能做错了什么。 Login:41 GET http://localhost:56599/Home/SessionInfo 500 (Internal Server Error) send @ jquery-1.8.2.js:8430 ajax @ jquery-1.8.2.js:7982 CheckSession @ Login:41
【解决方案2】:

通过发出这些会话检查 ajax 请求,您只需延长用户会话的生命周期。

如果您想通知浏览器用户会话已结束,我建议您实现SignalR 服务,以便在服务器和浏览器之间(实时)进行直接通信(推送功能)。

实现SignalR 服务, 在您的global.asax 文件中创建一个session_end 方法,在session_end 中向用户浏览器发送一条消息,表明您的会话已结束。

就是这样

【讨论】:

  • 我可能错了,但 global.asax 仅在会话状态模式为“InProc”时才有效。另一方面,我将状态模式用作“StateServer”。谢谢@阿里
  • 嗨,@Ali 我想对你的方法有更多的了解,因为我对 MVC .Net 还很陌生。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
相关资源
最近更新 更多