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.