Как я могу перенаправить на страницу, когда срок действия сеанса пользователя истек?
Автор вопроса: 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-контекста:
Поэтому я не думаю, что вы могли бы использовать его для перенаправления пользователя. Я видел, как другие предлагают использовать событие "Session_OnStart()" в файле global.ascx:
Другой способ - указать браузеру перенаправить себя (через 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
Вы также можете проверить решения, представленные по ссылке ниже.
Вы хотите перенаправить на следующий запрос или перенаправить немедленно, без вмешательства пользователя? Если вы хотите перенаправить без вмешательства пользователя, вы можете использовать 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);
}
}
}
}
}