Подтвердить что ты не робот

Как я могу перенаправить на страницу, когда истекает срок действия пользовательской сессии?

В настоящее время я работаю над веб-приложением, которое использует инфраструктуру ASP.NET 2.0. Мне нужно перенаправить на определенную страницу, скажем SessionExpired.aspx, когда истекает срок действия пользовательского сеанса. В проекте много страниц, поэтому добавление кода на каждую страницу сайта на самом деле не является хорошим решением. У меня есть MasterPages, хотя я думаю, что может помочь.

Спасибо!

4b9b3361

Ответ 1

Вы можете справиться с этим в global.asax в событии Session_Start. Вы можете проверить cookie сеанса в запросе. Если файл cookie сеанса существует, сеанс истек:

   public void Session_OnStart()
    {
        if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null)
        {
            HttpContext.Current.Response.Redirect("SessionTimeout.aspx")
        }

    }

Увы, я не нашел никакого изящного способа узнать имя cookie сеанса.

Ответ 2

Я обычно добавляю элемент управления HtmlMeta в коллекцию Page.Header.Controls на главной странице, когда пользователь "вошел в систему". Установите его для обновления на страницу SessionExpired.aspx с соответствующей длиной таймаута, и вам будет хорошо идти.

Ответ 3

Если я правильно понимаю, "Session_End" срабатывает внутренне и не имеет связанного с ним HTTP-контекста:

http://forums.asp.net/t/1271309.aspx

Поэтому я не думаю, что вы могли бы использовать его для перенаправления пользователя. Я видел, как другие предлагают использовать событие Session_OnStart() в файле global.ascx:

http://forums.asp.net/p/1083259/1606991.aspx

Я не пробовал, но для вас может работать следующий код в "global.ascx":

void Session_OnStart() {
    if (Session.IsNewSession == false )
    {
    }
    else 
    {
        Server.Transfer("SessionExpired.aspx", False);
    }
}

Ответ 4

Мы используем аутентификацию форм и вызываем этот метод в методе Page_Load

private bool IsValidSession()
    {
        bool isValidSession = true;
        if (Context.Session != null)
        {
            if (Session.IsNewSession)
            {
                string cookieHeader = Request.Headers["Cookie"];
                if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    isValidSession = false;
                    if (User.Identity.IsAuthenticated)
                        FormsAuthentication.SignOut();
                    FormsAuthentication.RedirectToLoginPage();
                }
            }
        }
        return isValidSession;
    }

Ответ 5

Другим способом является указание браузеру перенаправить себя (через javascript) через определенное время... но это всегда может быть отключено пользователем.

Ответ 6

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

  • Если пользователь посещает ваш сайт в течение таймаута сеанса (по 20 минут по умолчанию), сеанс не закончился, поэтому вам не нужно перенаправлять их.
  • Если пользователь посещает ваш сайт после истечения времени ожидания сеанса, сеанс уже закончился. Это означает, что они будут в контексте нового сеанса - Session_OnEnd уже запущен для старого сеанса, и вместо этого вы получите Session_OnStart для нового сеанса.

Помимо функции на стороне клиента (например, таймер JavaScript и т.д.), вам, следовательно, необходимо обработать переадресацию в Session_OnStart, но, очевидно, вам нужно отличить это от того, кто приходит на сайт заново. Один из вариантов - установить cookie сеанса при запуске их сеанса (т.е. Cookie без истечения срока действия, чтобы он продолжался до закрытия браузера), а затем найдите этот файл cookie в Session_OnStart - если он присутствует, это возвращающийся пользователь с истекшим сроком действия сеанс, если не новый пользователь.

Очевидно, вы все равно можете использовать Session_OnEnd для упорядочивания на стороне сервера - это просто взаимодействие с клиентом, которое не доступно вам.

Ответ 7

Вы помещаете что-то в объект Session, который всегда должен быть там? Другими словами, если они входят в систему, вы можете помещать что-то вроде UserID в сеанс

Session("UserID") = 1234

Итак, если это так, то вы можете добавить что-то свое кодовое имя на главной странице, которая проверяет это значение. Что-то вроде этого:

Dim UserID As Integer = 0
Integer.TryParse(Session("UserID"), UserID)

If UserID = 0 Then
  Response.Redirect("/sessionExpired.aspx")
End If

Ответ 8

Добавьте или обновите файл Web.Config, чтобы включить это или что-то подобное:

<customErrors defaultRedirect="url" mode="RemoteOnly">
    <error statusCode="408" redirect="~/SessionExpired.aspx"/>
</customErrors>

Ответ 9

Вы хотите перенаправить на следующий запрос или перенаправить сразу, без вмешательства пользователя? Если вы хотите перенаправлять без вмешательства пользователя, вы можете использовать ClientScript.RegisterStartupScript на своей главной странице, чтобы добавить немного javascript, который перенаправит ваши клиенты, когда истечет их сеанс.

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    String timeoutPage = "SessionExpired.aspx"; // your page here
    int timeoutPeriod = Session.Timeout * 60 * 1000;

    sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod);
    Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true);

Ответ 10

Код отсюда

namespace PAB.WebControls

{   использование системы;   использование System.ComponentModel;   используя System.Web;   используя System.Web.Security;   используя System.Web.UI;

[DefaultProperty("Text"),

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")]

public class SessionTimeoutControl : Control
{
    private string _redirectUrl;

    [Bindable(true),
        Category("Appearance"),
        DefaultValue("")]
    public string RedirectUrl
    {
        get { return _redirectUrl; }

        set { _redirectUrl = value; }
    }

    public override bool Visible
    {
        get { return false; }

    }

    public override bool EnableViewState
    {
        get { return false; }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (HttpContext.Current == null)

            writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]");

        base.Render(writer);
    }


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

        if (this._redirectUrl == null)

            throw new InvalidOperationException("RedirectUrl Property Not Set.");

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Page.Request.Headers["Cookie"];

                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    if (Page.Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }

                    Page.Response.Redirect(this._redirectUrl);
                }
            }
        }
    }
}

}