如何阻止基页递归检测会话超时

时间:2010-08-06 11:09:00

标签: asp.net session redirect recursion timeout

备用标题:如何重定向会话超时

最终解决方案:归功于:Robin Day(虽然我测试了Ben的解决方案,它也有效,其他两个解决方案也都是很好的解决方案)

我摆脱了原来的基页。

将它放在Global.asax的Session_Start

void Session_Start(object sender, EventArgs e) 
{
    string cookie = Request.Headers["Cookie"];
    // Code that runs when a new session is started
    if ((null != cookie) && (cookie.IndexOf("ASP.NET_SessionId") >= 0))//&& !Request.QueryString["timeout"].ToString().Equals("yes"))  
    {
        if(Request.QueryString["timeout"] == null || !Request.QueryString["timeout"].ToString().Equals("yes"))
            Response.Redirect("Default.aspx?timeout=yes");
    }
}

将它放在Defualt.aspx页面上:

 if (!IsPostBack)
    {
        if (Request.QueryString["timeout"] != null && Request.QueryString["timeout"].ToString().Equals("yes"))
        {
            Response.Write("<script>" +
               "alert('Your Session has Timedout due to Inactivity');" +
               "location.href='Default.aspx';" +
               "</script>");
        }
    }

即使在Default.aspx页面上发生超时,此解决方案也能正常工作


结束解决方案

我有一个检查会话超时的基页。 (就是这样)。如果有会话超时,我想重定向到主页。但是,主页也继承自此基页。

我不确定我是否在解释这个问题:

第1步:我的一个页面加载

步骤2:它超过20分钟(这会导致会话超时)。

第3步:点击导致poastback的东西

步骤4:Basepage检测到超时并重定向到default.aspx

步骤5:当default.aspx加载时,基页会检测到仍然存在超时,并再次尝试重定向到default.aspx。 第6步:重复第5步

粗体是不受欢迎的效果......

这是基页代码。

using System;  
using System.Web.UI;   
public class SessionCheck : System.Web.UI.Page  
{   
public SessionCheck()  {}  

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

    if (Context.Session != null)  
         {  
             //check the IsNewSession value, this will tell us if the session has been reset.  
             //IsNewSession will also let us know if the users session has timed out  
             if (Session.IsNewSession)  
             {  
                //now we know it's a new session, so we check to see if a cookie is present  
                 string cookie = Request.Headers["Cookie"];  
                 //now we determine if there is a cookie does it contains what we're looking for 
                 if ((null != cookie) && (cookie.IndexOf("ASP.NET_SessionId") >= 0))  
                 {  
                     //since it's a new session but a ASP.Net cookie exist we know  
                     //the session has expired so we need to redirect them  
                     Response.Redirect("Default.aspx?timeout=yes&success=no");  
                 }  
             }  
         }  
     }  
} 

感谢!!!

(如果您需要进一步说明,请询问)

注意:我知道如果我重定向到不从此基页继承的页面,它将解决问题。但我不喜欢这个解决方案。

5 个答案:

答案 0 :(得分:1)

您可以在Session_OnStart

中使用活动Global.asax吗?

每当新会话开始时,都会触发一次。你可以在那里进行重定向。

我猜的关键是,如果你还没有使用它,你只能重定向到主页。您只需检查Request对象中的URL即可完成此操作。

答案 1 :(得分:1)

创建一个公共基页,其中包含您希望在主页和其他页面中同时拥有的所有内容。

从这个主页和另一个基页(比如SessionCheck)继承你的会话到期逻辑。除了主页之外,你所有的页面都要从SessionCheck页面继承。

public class BasePage: System.Web.UI.Page //(this contains all things shared between all pages)
public class SessionCheck : BasePage //(your session loginc in this class)
public class Home : BasePage 

答案 2 :(得分:1)

我们有类似的情况。我们首先检查是否存在会话超时,如果当前页面不是默认登录页面,我们只会重定向。

答案 3 :(得分:1)

下面将使用您现有的代码来解决这个问题,但是robin day使用global.asax是一个更好的选择。

if (Context.Session != null)  
     {  
         //check the IsNewSession value, this will tell us if the session has been reset.  
         //IsNewSession will also let us know if the users session has timed out  
         if (Session.IsNewSession)  
         {  
            //now we know it's a new session, so we check to see if a cookie is present  
             string cookie = Request.Headers["Cookie"];  
             //now we determine if there is a cookie does it contains what we're looking for 
             if ((null != cookie) && (cookie.IndexOf("ASP.NET_SessionId") >= 0))  
             {  
                 //since it's a new session but a ASP.Net cookie exist we know  
                 //the session has expired so we need to redirect them
                 //Only redirect if the current page is NOT Default.aspx
                 if (Request.Path.Substring(Request.Path.LastIndexOf("/")) != "/Default.aspx") 
                 {
                     Response.Redirect("Default.aspx?timeout=yes&success=no");  
                 }
                 else if (Request.QueryString["timeout"] == "yes")
                 {
                     ScriptManager.RegisterStartupScript(this, this.GetType(), "TimeOutScript", "alert('Your session timed out');", true);
                 }
             }  
         }  
     } 

编辑答案以回复以下评论,因为这比添加更多评论更容易:

当会话超时时,我没有为您提供重定向的解决方案,您根本无法做到这一点,会话已经超时,没有任何重定向。你说“我只想知道是否有超时”,我给你一个解决方案。没有真正的方法可以判断用户是否正在点击页面x,因为他们的会话已经超时,或者因为他们已经打开了浏览器并开始了新的会话,所有你知道的是没有现有的会话。如果他们点击页面,他们需要进行身份验证才能查看,然后您可以假设会话已超时,因为他们不应该从头开始访问页面。但是你不能在主页上这样做,因为你不能分辨出在这个页面上超时的用户与刚刚第一次访问该页面的用户之间的区别。我已更新代码,以便除Default.aspx以外的每个页面都会重定向,如果由于会话超时而重定向到Default.aspx,则会弹出一个javascript警报。

答案 4 :(得分:0)

在您的基页中放置一个属性:

public bool IsDefault { get; set; }

在默认页面的PreInit事件中:

public void Default_PreInit(object sender, System.EventArgs e)
{
    this.IsDefault = true;
}

修改会话检查:

if (Context.Session != null && !this.IsDefault)
{
    // blibbitty blah blah
}