Как остановить базовую страницу от рекурсивного определения времени ожидания сеанса - PullRequest
3 голосов
/ 06 августа 2010

Альтернативное название: Как перенаправить по истечении времени ожидания сеанса

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ: Благодарность: Робин Дей (хотя я тестировал решение Бена, и оно тоже работает, и оба других решения также являются хорошими решениями)

Я избавился от базовой страницы, которая была у меня изначально.

Поместите это в Session_Start of Global.asax

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.


END SOLUTION

У меня есть базовая страница, которая проверяет время ожидания сеанса.(это все, что он делает).Я хочу перенаправить на домашнюю страницу, если есть время ожидания сеанса.Однако домашняя страница также наследуется от этой базовой страницы.

Я не уверен, правильно ли я объясняю это:

Шаг 1: одна из моих страниц загружается

Шаг 2: он длится более 20 минут (это может привести к тайм-ауту сеанса).

Шаг 3: я нажимаю на то, что вызывает poastback

Шаг 4: Базовая страница обнаруживает тайм-аут и перенаправляет на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 ]

1 голос
/ 06 августа 2010

Ниже приведен трюк с вашим существующим кодом, но лучше использовать глобальный предложенный день, чтобы использовать 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.

1 голос
/ 06 августа 2010

Создайте общую базовую страницу, которая содержит все, что вы хотите иметь как на своей домашней странице, так и на других страницах.

Чем наследовать от этой вашей домашней страницы и другой базовой страницы (скажем, 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 
1 голос
/ 06 августа 2010

У нас была похожая ситуация.Сначала мы проверяем, есть ли время ожидания сеанса, и перенаправляем его только в том случае, если текущая страница не является страницей входа по умолчанию.

1 голос
/ 06 августа 2010

Можете ли вы использовать событие Session_OnStart в пределах Global.asax?

Это будет запущено один раз, когда начинается новый сеанс.Вы можете сделать свое перенаправление там.

Ключ, который я предполагаю, заключается в том, что вы только перенаправляете на домашнюю страницу, если вы еще не на ней.Вы можете сделать это, просто проверив URL в объекте Request.

0 голосов
/ 06 августа 2010

Поместите свойство на вашей базовой странице:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...