Le Journal Auto Off une fois que la session expire
-
12-09-2020 - |
Question
Notre application se déconnecte au bout de 30 min et obtient redirigé vers la page de connexion,je suis en précisant délai d'expiration de session dans web.xml et à l'aide d'un requestProcessor pour la redirection.Je veux montrer à l'utilisateur un message disant que votre session a obtenu expiré une fois que la session expire,comment puis-je le faire.Le journal Auto off ?Je voudrais invite le message d'erreur sur la page"La session est le délai d'attente, veuillez vous connecter de nouveau" .Alors comment ai-je pu détecter la session timeout?aucune des méthodes de déclencher automatiquement?
La solution
Créer une activité checker qui vérifie toutes les minutes si toute activité de l'utilisateur a eu lieu (clic de souris, keypress) et effectue un battement de coeur à côté serveur pour la garder active lorsque l'utilisateur est actif et ne fait rien lorsque l'utilisateur n'est pas active.Quand il n'y a pas d'activité pendant 30 minutes (ou quelle que soit la valeur par défaut délai d'expiration de session est été mis sur le côté serveur), puis d'effectuer une redirection.
Voici un coup d'envoi exemple avec un peu d'aide de jQuery pour lier et cliquez sur événements de pression de touche et le feu à une requête 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>
Créer un Servlet
qui écoute sur le /heartbeat
et n'en gros que les suivants:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
request.getSession();
}
pour la garder active.
Lorsque vous rangez l'utilisateur connecté à la session, il sera "automatiquement" déconnecté à chaque fois que la session expire.Si vous n'avez pas besoin d'manuellement déconnexion de l'utilisateur.
Autres conseils
Créer une classe Écouteur mise en œuvre de HttpSessionListener
et de le définir dans web.xml
Cela permettra de vous avertir lorsqu'une session est détruite.L'utilisation de la sessionDestroyed()
la méthode.
Voir un exemple complet ici:
http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
Soit, c'est peut-être un servlet simple, une déconnexion automatique de Spring-MVC ou Spring-Security n'est pas possible sans la logique côté client parfaite.
Considérant que l'application aura à la fois le type de demande
- AJAX et
- Soumission de formulaire / rechargement de page
La déconnexion automatique nécessite une logique très calculée. Présenter ma mise en œuvre de la fonctionnalité autologut avec
Avantages.
1. Aucun appel / demande supplémentaire n'est utilisé pour y parvenir. Considérant l'impact des performances Si plus de 10 000 utilisateurs actifs et des appels supplémentaires pour atteindre la déconnexion automatique.
2. Configuration d'une ligne à l'aide de la balise.
3. Fonctionne parfaitement même si l'utilisateur ouvre plusieurs onglet ou plusieurs fenêtres.
4. Il vous intime avant 30 secondes d'invalidation de la session. Si vous avez rempli le formulaire et non soumis, vous pouvez garder la session en vie (prolongation d'un clic sur un clic). Donc l'utilisateur moins susceptible de perdre des données non enregistrées.
Utilisation
....
</body>
<jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
<%@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>
session.setMaxInactiveInterval(300);
session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);
Remarque: il peut être déplacé vers une page de modèle de script autologut-Script si vous êtes bon chez CSS. Vous pouvez donc éviter d'ajouter cela dans chaque page.
Inclure Bootstrap ou ajouter votre CSS personnalisé.
<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>
C'est tout sur une simple implémentation de déconnexion automatique.
Vous pouvez télécharger un exemple de travail de mon référentiel GitHub
Autologut à l'aide d'un exemple de servlet simple
Autologut à l'aide d'exemple de configuration Java Security de
Autologut à l'aide de l'exemple de configuration XML de Security
Logique expliquée
Case 1: À la page Charger
Ici, la logique est simple, à la page Fixer la minuterie d'intervalle Equlas à MaxinActiveInterval. Après le délai de redirection de la page de connexion.
Cas 2: Gardez la piste Ajax Appels
Considérant maintenant les demandes Ajax, vous pouvez utiliser des rappels .Ajaxstart () ou .AjaxComplete () de jQuery de sorte que, si une demande AJAX soit virée, vous pouvez réinitialiser l'intervalle.
Cas 3: Suivi de l'activité multi-tabulation / fenêtre
La communication entretien est effectuée pour synchroniser l'état de chaque onglet. LocalStorage d'occasion sur le changement de changement.
Limitations / améliorations requises
1. Si une session maximale autorisée est une, si la session est extraite d'un autre système, la demande AJAX échouera. Il doit être manipulé pour rediriger la page de connexion.
2. Utilisez AJAXSTART () au lieu d'AjaxComplet () pour avoir une synchronisation exacte des valeurs d'idletime entre serveur et navigateur.
exigences
1. jQuery
Alternatives à la mise en œuvre actuelle comparée
1.
response.setHeader("Refresh", "60; URL=login.jsp");
-
réglage META Actualiser Tag
<meta http-equiv="refresh" content="60; url=login.jsp">
- Configuration du vérificateur d'activité
Garde la session en vie par demande Ajax répétée. Piste le temps de ralenti et fait la demande de déconnexion après le délai d'attente.
Nul doute que c'est un bon avec une logique simple. Mais je veux juste encre mes observations.-
Impact des performances
-
Si vous utilisez des sessions de servlet, vous pouvez vérifier si la session du JSP / servlet renvoie est nouvelle à l'aide de la méthode ISnew ().Si oui, la session de l'utilisateur a expiré et que vous pouvez afficher les messages correspondants.
Inclure une fonction d'utilitaire JavaScript dans votre JSP et ping le serveur toutes les 31 minutes. La fonction utilitaire mentionnée ci-dessus devrait utiliser la fonction SetTimeOut () JS en interne.
setTimeout ( "checkServerSession()", /* intervalInMilliSeconds */ 31000);
Notez que
checkServerSession ()
est une fonction JS régulière qui peut déclencher des demandes HTTP.Si la demande est une session réussie, il existe autrement, montrez l'invite à l'utilisateur.