【问题标题】:How to Redirect on Session End [duplicate]如何在会话结束时重定向 [重复]
【发布时间】:2015-01-02 20:25:34
【问题描述】:

我正在尝试在会话结束时将用户重定向到另一个页面。

此代码将导致“对象引用未设置为对象的实例”。异常

void Session_End(Object sender, EventArgs E)
{
    HttpContext.Current.Response.Redirect("/");
}

知道怎么做吗?

【问题讨论】:

  • 当您获得该触发器时,您与用户页面没有任何联系,因此 Reponse 为空。尝试进行某种 javascript 调用来检查用户是否没有丢失他们的会话。这很棘手,因为每个调用都可以再次触发会话更新。
  • 您正在挂钩一个与页面请求无关的事件,这就是为什么您的 HttpContext.Current (可能)是这里的空引用。你具体想要什么?您是否想实现注销功能,或者可能检测用户何时不在会话中?这些都是不同的情况,有不同的答案,每一个都与上面的代码不同。
  • 我想将用户重定向到注销页面
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

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


【解决方案1】:

Session_End 由服务器内部触发,基于内部计时器。因此,发生这种情况时没有关联的HttpRequest。这就是为什么Response.RedirectServer.Transfer 没有意义并且不起作用的原因。

我在过去看到过有关此问题的解决方法,但从未尝试过,您应该创建每个页面都继承的 Base 类。 OnInit 在基类中添加这个。基类继承UI.Page如果您不使用基类逻辑,则应将此逻辑添加到每个不好的页面。

    protected override void OnInit(System.EventArgs e)
    {
         Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));      

         if(Session.IsNewSession)  
            Response.Redirect(“Logout.aspx”);// or another page which you want.
    }

一旦会话过期,页面应该在 5 秒后刷新,如果你会发现会话是新的并且你会重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 2011-12-06
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2013-09-13
    • 2012-10-12
    • 2013-05-01
    相关资源
    最近更新 更多