Pergunta

Atualmente, estou trabalhando em um projeto ASP.NET 3.5 e tentando implementar a detecção de tempo limite da sessão. Eu sei como fazer isso com cookies de sessão ativados, mas sem eu estou totalmente perdido.

Quando o tempo limite da sessão ocorre, quero redirecionar o usuário para uma página personalizada.

Alguém pode me explicar como fazer isso?

Minha solução baseada em biscoitos se parece com isso e não quero reproduzir seu comportamento:

if (Session.IsNewSession && (Request.Cookies["ASP.NET_SessionId"] != null))
    Response.Redirect("...");
Foi útil?

Solução 2

Parece que encontrei uma solução. Não estou muito feliz com isso, mas no momento em que funciona.

Eu adicionei um campo oculto à minha marca de página

<asp:HiddenField ID="sessionID" runat="server" />

e seguindo o código para o meu CodeBehind

public void Page_Load(object sender, EventArgs eventArgs)
{
    if (Context.Session != null) {
        if (Context.Session.IsNewSession) {
            if (!string.IsNullOrEmpty(sessionID.Value)) {
               Response.Redirect("~/Timeout.aspx")
            }
        }
        sessionID.Value = Context.Session.SessionID;   
    }
}

Você também precisa adicionar isso ao seu web.config ou ASP ignora todos os campos de formulário postados

<sessionState cookieless="true" regenerateExpiredSessionId="false"/>

RegenerateExiredSessionId é o atributo importante.

Outras dicas

Session_end no global.asax sempre devem ser disparados, apesar do tipo de sessão usada.

-Edit: você também pode estar interessado em

Session.IsNewSession

Como isso fornece informações sobre novas solicitações, se a sessão anterior poderia ter sido cronometrada.

Ele funciona praticamente da mesma maneira - o serviço de sessão atualiza um registro de data e hora toda vez que o ASP.NET recebe uma solicitação com esse ID da sessão no URL. Quando o horário atual é> n sobre o registro de data e hora, a sessão expira.

Se você colocar algo em sessão e verificar se está lá em cada solicitação, se não estiver, você sabe que a sessão é fresca (substituindo uma ou um novo usuário expirado).

Eu daria uma olhada na seção "banco de dados" da resposta de Anthonywjones a uma pergunta semelhante aqui:

ASP.NET Timeout Session Detecção: session.isNewsession e SessionCookie Detecção A melhor maneira de fazer isso?

No evento de início da sessão, você poderá verificar um banco de dados para a existência do SessionID - presumo que, se solicitar uma página com o SessionID no URL, esse é o SessionID que eu usarei - eu tenho não testou isso.

Você deve limpar esse banco de dados quando um usuário efetuar login manualmente para garantir que você armazene uma nova instância do seu sinalizador.

Se você não gosta Session_End, você pode tentar uma solução muito rápida e suja. Configurar um Session["Foo"] valor em Session_Start dentro global.asax, então verifique Session["Foo"] na sua página. Se for nulo, a sessão expirou ..

Esta é uma das soluções propostas no Blog de Nikhil. Confira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top