11

我想在会话超时时自动重定向到登录页面。

在 web.config 文件中,我有以下代码

<configuration>
    <system.web>
       <sessionState mode="InProc"  timeout="1"/>
    </system.web>
</configuration>

在 Global.asax 文件中-

protected void Session_End(object sender, EventArgs e)
{
    Response.Redirect("LoginPage.aspx");
}

但超时后,我收到以下错误:

用户代码未处理 HttpException。

在这种情况下没有响应。

有什么线索可以解决这个问题吗?

4

7 回答 7

8

Session_End 在会话结束时调用 - 通常在最后一次请求后 20 分钟(例如,如果浏览器处于非活动状态或关闭)。
由于没有请求,因此也没有响应。

Application_AcquireRequestState如果没有活动会话,我建议进行重定向。请记住通过检查当前 url 来避免循环。

编辑:我不喜欢内置身份验证的.Nets,示例进入Global.asax

    protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        try
        {
            string lcReqPath = Request.Path.ToLower();

            // Session is not stable in AcquireRequestState - Use Current.Session instead.
            System.Web.SessionState.HttpSessionState curSession = HttpContext.Current.Session;

            // If we do not have a OK Logon (remember Session["LogonOK"] = null; on logout, and set to true on logon.)
            //  and we are not already on loginpage, redirect.

            // note: on missing pages curSession is null, Test this without 'curSession == null || ' and catch exception.
            if (lcReqPath != "/loginpage.aspx" &&
                (curSession == null || curSession["LogonOK"] == null))
            {
                // Redirect nicely
                Context.Server.ClearError();
                Context.Response.AddHeader("Location", "/LoginPage.aspx");
                Context.Response.TrySkipIisCustomErrors = true;
                Context.Response.StatusCode = (int) System.Net.HttpStatusCode.Redirect;
                // End now end the current request so we dont leak.
                Context.Response.Output.Close();
                Context.Response.End();
                return;
            }
        }
        catch (Exception)
        {

            // todo: handle exceptions nicely!
        }
    }
于 2013-09-02T04:57:21.133 回答
4

如果您正在使用类似的东西FormsAuthentication来维护应用程序的安全性,那么这部分(您正在尝试做的部分)将为您完成。如果 FormsAuthentication 发现用户的会话已过期,它会将他或她重定向回您的登录页面。

其次,不要过分依赖,因为如果您将会话提供程序从InProc更改为SQLServer或其他进程外提供程序Session_End,它将永远不会触发。

于 2013-09-02T04:53:13.273 回答
1

您可以使用会话属性IsNewSession来检测是否是会话超时。

如果为此请求创建了新会话,则ASP.NETHttpSessionState类具有IsNewSession()返回的方法。true检测会话超时的关键是还要ASP.NET_SessionId在请求中查找 cookie。

当然,我也同意我们应该将下面的代码放在一些所谓的自定义 BasePage 中,所有页面都使用它,以有效地实现这一点。

override protected void OnInit(EventArgs e)
  {
       base.OnInit(e);   

if (Context.Session != null)
   {
if (Session.IsNewSession)
    {

     string CookieHeader = Request.Headers["Cookie"];
     if((CookieHeader!=null) && (CookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
     {
      // redirect to any page you need to
      Response.Redirect("sessionTimeout.aspx");
     } 
   }
 }
}

如果您想将上述代码放在基页类中,请查看此链接以获取更多说明。

于 2013-09-02T05:38:14.260 回答
1

您应该使用 Application_AcquireRequestState 您会发现 Application_AuthenticateRequest 不再有会话上下文(或从未有过)。在我对此的研究中,我发现了这篇文章,它为我解决了这个问题。感谢去 Waqas Raja。

asp.net:在哪里放置代码以将没有会话的用户重定向到主页?

于 2013-10-29T10:08:07.907 回答
0

我认为您收到“在这种情况下不可用响应”,因为用户没有向服务器发出请求,因此您无法向它提供响应。请尝试使用 Server.Transfer。

于 2013-09-02T04:47:56.623 回答
0

我觉得最简单的方法是使用元信息并让技巧发挥作用。考虑我们有一个页面WebPage.aspx在文件中添加以下代码WebPage.aspx.cs

private void Page_Load(object sender, System.EventArgs e){      
    Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));      
    if(Session[“IsUserValid”].ToString()==””)              
    Server.Transfer(“Relogin.aspx”);
}

在上面的代码中,WebPage.aspx一旦 Session 过期,就会在 5 秒后刷新。并在页面加载中验证会话,因为会话不再有效。该页面被重定向到重新登录页面。每次回发到服务器都会刷新会话,并且会在WebPage.aspx.

于 2016-05-18T07:13:34.643 回答
-1

您可以在 web.config 中简单地执行以下操作

<configuration>
<system.web>
<sessionState mode="InProc"  timeout="1" loginurl="destinationurl"/>
</system.web>
</configuration>

因为,我们无法从 Session_End 重定向,因为那里没有响应/重定向。通过使用它,当会话超时时,您将被重定向到destinationurl。希望这会有所帮助。

于 2015-03-25T15:56:14.023 回答