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

12
задан Fede F 26 September 2008 в 15:44
поделиться

10 ответов

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

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

    }

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

5
ответ дан 2 December 2019 в 07:22
поделиться

Я обычно добавляю управление HtmlMeta к Странице. Заголовок. Набор средств управления на основной странице, когда пользователь "вошел в систему". Установите его для Обновления к странице SessionExpired.aspx с соответствующей продолжительностью тайм-аута, и Вы хороши пойти.

5
ответ дан 2 December 2019 в 07:22
поделиться

Если я понимаю правильно, огни "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
ответ дан 2 December 2019 в 07:22
поделиться

Мы используем Аутентификацию Форм и называем этот метод в методе 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;
    }
3
ответ дан 2 December 2019 в 07:22
поделиться

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

2
ответ дан 2 December 2019 в 07:22
поделиться

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

Session("UserID") = 1234

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

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

If UserID = 0 Then
  Response.Redirect("/sessionExpired.aspx")
End If
1
ответ дан 2 December 2019 в 07:22
поделиться

Добавьте или обновите свою сеть. Файл конфигурации для включения этого или чего-то подобного:

<customErrors defaultRedirect="url" mode="RemoteOnly">
    <error statusCode="408" redirect="~/SessionExpired.aspx"/>
</customErrors>
0
ответ дан 2 December 2019 в 07:22
поделиться

Вы обращаетесь к перенаправлению по следующему запросу или сразу перенаправляете без вмешательства пользователя? Если Вы обращаетесь к перенаправлению без вмешательства пользователя, то можно использовать ClientScript. RegisterStartupScript на Вашем Ведущем устройстве Page для введения небольшого количества 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);
0
ответ дан 2 December 2019 в 07:22
поделиться

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

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

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

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

1
ответ дан 2 December 2019 в 07:22
поделиться

Кодируйте отсюда

namespace PAB.WebControls

{использование Системы; использование Системы. ComponentModel; использование Системы. Сеть; использование Системы. Сеть. Безопасность; использование Системы. Сеть. 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);
                }
            }
        }
    }
}

}

0
ответ дан 2 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: