46 votes

Délai d'expiration de la session et traitement des exceptions ViewExpiredException sur les requêtes ajax JSF/PrimeFaces

Je trouve cet article utile pour les demandes non-ajax. Comment gérer l'expiration de la session et l'exception ViewExpiredException dans JSF 2 ? mais je ne peux pas l'utiliser lorsque je soumets un appel AJAX.

Supposons que dans une boîte de dialogue primefaces, j'effectue une demande de post en utilisant AJAX et que la session a déjà expiré. Je vois ma page se bloquer.

Comment résoudre ce genre de scénario de telle sorte que, lorsque je publie un message en utilisant AJAX, je puisse le rediriger vers ma page de visualisation expirée et puis le rediriger vers la page de connexion, de manière similaire à la solution proposée dans le lien ci-dessus ?

JSF2/Primefaces/Glassfish

1voto

mko Points 51

Pour moi, un simple gestionnaire javascript côté client a fonctionné :

function handleAjaxExpired(xhr,status,args) {
    // handler for "oncomplete" ajax callback
    if ( xhr.responseXML.getElementsByTagName('error-name').length ) {
        // "<error-name>" tag is present -> check for "view expired" exception
        html = xhr.responseXML.getElementsByTagName('error-name')[0].innerHTML;

        if ( html.indexOf('ViewExpiredException') > -1 ) {
            // view expired exception thrown
            // do something / reload page
            if ( confirm('session expired -> reload page?') ) {
                document.location.href=document.location.href;
            }
        }
    }
}

Ce gestionnaire est appelé à partir de l'attribut "oncomplete" de l'élément d'interface utilisateur déclencheur, par exemple ici à partir d'un événement rowSelect dans une table de données Primefaces :

<p:ajax event="rowSelect" oncomplete="handleAjaxExpired(xhr,status,args)" />

Mise à jour : Pour éviter d'ajouter des attributs "oncomplete" à chaque élément activé par ajax, ce code javascript recherche globalement les erreurs dans toutes les réponses ajax :

(function() {
    // intercept all ajax requests
    var origXHROpen = XMLHttpRequest.prototype.open;

    XMLHttpRequest.prototype.open = function() {

        this.addEventListener('load', function() {
            handleAjaxExpired(this);
        });
        origXHROpen.apply(this, arguments);
    };
})();

Ce code rend obsolète les attributs "oncomplete" dans les éléments d'interface utilisateur PrimeFaces.

0 votes

Donc, vous devez mettre ça dans chaque oncomplete de chaque appel Ajax ?

0 votes

Oui, je n'ai pas trouvé de gestionnaire général pour les réponses Ajax ("oncomplete"). Des suggestions comme dans stackoverflow.com/questions/14764619/ n'a pas fonctionné pour moi.

1 votes

J'ai déjà essayé - sans succès, peut-être trop compliqué dans mon environnement ;-) Mais en attendant, j'ai trouvé une solution pour intercepter toutes les réponses ajax et j'ai mis à jour le post original. Merci beaucoup pour vos inspirations !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X