在Session_end事件上重定向到另一个页面

时间:2013-09-02 04:44:25

标签: c# asp.net

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

在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进行处理。

     

在此背景下无法获得响应。

解决这个问题的任何线索?

7 个答案:

答案 0 :(得分:7)

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

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

编辑:我不喜欢。内置身份验证的网络,示例进入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!
        }
    }

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

如果为此请求创建了新会话,则ASP.NET HttpSessionState类具有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");
     } 
   }
 }
}
如果您想将上述代码放在基页类中,请检查此link以获取更多说明。

答案 3 :(得分:1)

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

asp.net: where to put code to redirect users without a session to the homepage?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您只需在web.config

中执行以下操作即可
<configuration>
<system.web>
<sessionState mode="InProc"  timeout="1" loginurl="destinationurl"/>
</system.web>
</configuration>

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

答案 6 :(得分:0)

我感觉最简单的方法是使用元信息并使技巧发挥作用。考虑我们有一个页面WebPage.aspxWebPage.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会在5秒后刷新。并且在页面加载中会话被验证,因为会话不再有效。该页面将重定向到“重新登录”页面。每次回发到服务器都会刷新会话,同样会在WebPage.aspx的元信息中更新。