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?

Était-ce utile?

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


1. Inclure le script de déconnexion automatique dans les pages JSP requises, comme indiqué ci-dessous.

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

2. Créez une page JSP, Autologut-Script.jsp et ajouter le code ci-dessous. Remarque: aucune modification / configuration n'est requise

<%@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. Configurer les attributs de session pour configurer le délai d'attente Remarque: configurez ceci après la création de session. Vous pouvez implémenter la méthode SessionCreated HTTPSPessionListener et définir la configuration suivante selon votre exigence.

session.setMaxInactiveInterval(300);

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

4. Ajouter ci-dessous HTML pour afficher la minuterie.
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>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>

 Entrez la description de l'image ici

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. Réglage de l'en-tête de rafraîchissement dans la réponse HTTP. (ne fonctionne pas pour les demandes AJAX)

response.setHeader("Refresh", "60; URL=login.jsp");

  1. réglage META Actualiser Tag dans HTML (ne fonctionne pas pour les demandes AJAX)
  2. <meta http-equiv="refresh" content="60; url=login.jsp">
    
    1. 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 2 demandes sont effectuées par minute pour maintenir la session Alive et 50k utilisateurs actifs. Demandes 100K par minute.
      • Intertab Communication Si deux onglets sont ouverts, une seule onglet reçoit une activité, mais une autre onglet ne reçoit pas d'activité, cette onglet incendie la phrase de déconnexion et une session invalide même si l'activité est présente dans une autre onglet. (Mais peut être manipulé)
      • approche de la déconnexion de la force Un client est dominé par-dessus le serveur d'invalider la session.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top