Registo automático de Fora uma vez que a sessão expira
-
12-09-2020 - |
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?
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>
<small>Refresh</small>
<i class="glyphicon glyphicon-refresh"></i>
</span>
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");
- 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">
- 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.