Pergunta

Nosso aplicativo termina depois de 30 min e é redireccionado para a página de login,eu sou a especificação de tempo de espera da sessão em web.xml e usando um requestProcessor para o redirecionamento.Eu quero mostrar para o usuário uma mensagem informando que a sessão tem expirou uma vez que a sessão expire,como posso fazer isso.Registo automático de folga ?Eu gostaria de solicitar a mensagem de erro na página"A sessão de tempo de espera, por favor, faça login novamente" .Então como eu poderia detectar a sessão é o tempo de espera?será que qualquer um dos métodos de disparar automaticamente?

Foi útil?

Solução

Criar uma actividade de verificador de que verifica a cada minuto se qualquer atividade do usuário tenha ocorrido (clique do mouse, keypress) e executa uma pulsação para o lado do servidor para manter o funcionamento de sessão quando o usuário está ativo e não faz nada quando o usuário não estiver ativo.Quando não há nenhuma atividade por 30 minutos (ou qualquer que seja o padrão de tempo limite de sessão é definido no lado do servidor) e, em seguida, executar um redirecionamento.

Aqui está um kickoff exemplo, com pouca ajuda de jQuery para vincular e clique em eventos keypress e fogo solicitação ajax.

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {
        $.active = false;
        $('body').bind('click keypress', function() { $.active = true; });
        checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
    });

    function checkActivity(timeout, interval, elapsed) {
        if ($.active) {
            elapsed = 0;
            $.active = false;
            $.get('heartbeat');
        }
        if (elapsed < timeout) {
            elapsed += interval;
            setTimeout(function() {
                checkActivity(timeout, interval, elapsed);
            }, interval);
        } else {
            window.location = 'http://example.com/expired'; // Redirect to "session expired" page.
        }
    }
</script>

Criar um Servlet o que escuta /heartbeat e não, basicamente, o seguinte:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    request.getSession();
}

para manter a sessão viva.

Quando você armazenar o usuário logado na sessão, será "automagicamente" iniciada sempre que a sessão expira.Assim você não precisa manualmente o logout do usuário.

Outras dicas

Criar um Ouvinte da classe de implementação HttpSessionListener e definir em web.xml

Este irá notificá-lo quando qualquer sessão é destruída.Use o sessionDestroyed() o método.

Veja um exemplo completo aqui:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

Qualquer um pode ser o servlet simples, spring-mvc ou spring-security auto logout não é possível sem a perfeita do lado do cliente lógica.
Considerando a aplicação tem tanto tipo de solicitação

  • AJAX e
  • envio de formulário/recarregar a página

Auto logout precisa de muito calculado lógica.Apresentar o meu autologout a funcionalidade de implementação, com os seguintes

Vantagens.


1.Nenhuma chamada extra/pedido é utilizado para conseguir isso.considerando o impacto de desempenho se mais de 10 mil usuários ativos e chamadas extra para conseguir o auto logout.
2.Uma linha de configuração usando a tag.
3.Funciona perfeitamente, mesmo se o usuário abre várias aba ou janela múltipla.
4.Ele dá a entender que, antes de 30 segundos da sessão de invalidação, por isso, se você tiver preenchido o formulário e não enviada, você pode manter a sessão viva(estender a sessão com um clique).Assim o usuário menos provável para perder os dados não salvos.

Utilização


1.Incluem auto logout script em páginas JSP como o dado abaixo.

    ....
    </body>
    <jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>

2.Criar uma página JSP, autologout-script.jsp e adicione o código abaixo. Nota:Nenhuma edição/configuração é necessária

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<script>
$(document).ready(function()
{
    var timeOutTimeInSeconds = ${ timeOutTimeInSeconds }; 
    var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

    var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
    var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
    var badgeTimerId;
    window.localStorage.setItem("AjaxRequestFired", new Date());

    function redirectToLoginPage(){
        //location.href =  '<c:url value="/" />'+'${loginPageUrl}';
        window.location.reload();
    }

    $(document).ajaxComplete(function () {
        resetTimer();
    });

    $(window).bind('storage', function (e) {
         if(e.originalEvent.key == "AjaxRequestFired"){
             console.log("Request sent from another tab, hence resetting timer")
             resetTimer();
         }
    });

    function resetTimer()
    {
        showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

        console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
        window.localStorage.setItem("AjaxRequestFired", new Date());

        window.clearInterval(sessionCheckIntervalId);
        sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);

        window.clearInterval(timerDisplayIntervalId);
        timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);

        hideTimer();
    }

    function showTimer()
    {
        $('#sessionTimeRemaining').show();
        $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        window.clearInterval(timerDisplayIntervalId);
        badgeTimerId = setInterval(function(){
            $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        }, 1000);
    }

    function hideTimer()
    {
        window.clearInterval(badgeTimerId);
        $('#sessionTimeRemaining').hide();
    }
});
</script>

3.Configurar a sessão de atributos para configurar a definição de limite de tempo Nota:Configurar este após a criação da sessão.Você pode implementar HttpSessionListener sessionCreated método e definir a seguinte configuração como por sua exigência.

session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

4.Adicionar html abaixo para a exibição do temporizador.
Nota:ele pode ser movido para autologout-modelo de script de página se você é bom em CSS.Assim você pode evitar para adicionar este em cada página.
Incluem bootstrap ou adicionar o css personalizado.

<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining" 
    onclick="ajaxSessionRefresh()" style="display:none;">
    <i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>

enter image description here

Que é tudo sobre um simples auto logout implementação.Você pode baixar o exemplo do trabalho do meu repositório no github
Autologout usando servlet simples exemplo
Autologout usando spring-security java exemplo de configuração
Autologout usando spring-security configuração xml de exemplo

A Lógica Explicada


Caso 1:Sobre o carregamento da Página
Aqui a lógica é simples, no carregamento da página, defina o temporizador de intervalo equlas para maxInactiveInterval.após o tempo limite redirecionar para a página de login.
Caso 2:Acompanhe as chamadas AJAX
Agora, considerando requisições AJAX, você pode usar .ajaxStart() ou .ajaxComplete() retornos de chamada do jquery, de modo que, se qualquer solicitação ajax é acionado, você pode redefinir o intervalo.
Caso 3:Acompanhamento multi aba/janela de atividade
Intertab de comunicação é feito para sincronizar o estado de cada guia.Usado localStorage no evento de alteração.

Limitações/Melhorias necessárias
1.Se o máximo permitido de sessão, se a sessão for tomada a partir de outro sistema, solicitação AJAX irá falhar.Ele precisa ser tratado para se redirecionar para a página de login.
2.Use ajaxStart() em vez de ajaxComplete() para ter exata de sincronização de idleTime valores entre o servidor e o navegador.

Requisitos
1.Jquery

Alternativas para implementação atual comparada


1. Definição de cabeçalho de Atualizar na resposta http. (Não funciona para requisições AJAX)

response.setHeader("Refresh", "60; URL=login.jsp");
  1. Definição de meta tag de atualização em HTML (Não funciona para requisições AJAX)
<meta http-equiv="refresh" content="60; url=login.jsp">
  1. A configuração de Actividade do verificador Mantém a sessão viva por repetidas solicitação AJAX.Faixas de tempo de inactividade e faz logout pedido após o tempo limite.
    Sem dúvida é um muito bom com lógica simples.Mas eu só quero tinta minhas observações.
    • Impacto no desempenho se 2 pedidos são feitos por minuto para manter sessão vivo e 50 mil usuários ativos.100 mil solicitações por minuto.
    • Intertab comunicação Se duas abas estão abertas, uma guia está recebendo atividade, mas outros separador não está recebendo a atividade, que guia incêndios logout pedido e invalidar a sessão, mesmo que a atividade está presente no separador outras.(Mas pode ser tratada)
    • Força logout abordagem Ele é um cliente é dominada através de servidor para invalidar a sessão.

Se você estiver usando sessões de servlet, poderá verificar se a sessão que o JSP / Servlet está retornando é nova usando o método isnew ().Se sim, a sessão do usuário expirou e você poderá exibir as mensagens relevantes.

Incluem um javascript função de utilidade dentro do seu JSP e o ping do servidor a cada 31 minutos.O acima mencionado função de utilidade deve estar usando setTimeout() JS funcionar internamente.

setTimeout ( "checkServerSession()",  /* intervalInMilliSeconds */ 31000);

Note que

checkServerSession()

é uma regulares de função JS que podem disparar solicitações HTTP.Se a solicitação for bem-sucedida sessão existe outra forma de mostrar o prompt para o usuário.

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