Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Fede FОтветов: 11

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

Спасибо!

Ответы

Ответ 1 · рейтинг 5 · csgero

Вы можете обработать это в 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 · рейтинг 5 · Pseudo Masochist

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

Ответ 3 · рейтинг 4 · Gabe Sumner

Если я правильно понимаю, "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 · рейтинг 3 · CSharpAtl

Мы используем аутентификацию с помощью форм и вызываем этот метод в методе 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 · рейтинг 2 · Pablo Marambio

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

Ответ 6 · рейтинг 1 · Simon Forrest

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

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

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

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

Ответ 7 · рейтинг 1 · Micky McQuade

Вы помещаете что-то в объект 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 · рейтинг 1 · Avdhoota

Вы также можете проверить решения, представленные по ссылке ниже.

Обнаружение времени ожидания сеанса и перенаправление на страницу входа в ASP.NET

Ответ 9 · wprl

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

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

Ответ 10 · Jeremy Frey

Вы хотите перенаправить на следующий запрос или перенаправить немедленно, без вмешательства пользователя? Если вы хотите перенаправить без вмешательства пользователя, вы можете использовать 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);

Ответ 11 · TheEmirOfGroofunkistan

Код отсюда

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);
                }
            }
        }
    }
}

}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы