2012-02-16 9 views
9

C'è un modo per collegare un listener globale a tutte le chiamate AJAX in JSF? Forse attraverso un ascoltatore di fase o qualcosa del genere?Utilizzando JSF 2.0/Facelets, c'è un modo per collegare un listener globale a tutte le chiamate AJAX?

Ecco l'enigma ... Diciamo che stai usando f: tag ajax e qualcosa come apache shiro e lasci scadere la tua sessione. Quindi torni indietro e fai clic su un pulsante a cui è associata una f: ajax. Il server risponderà con un reindirizzamento 302 alla pagina di accesso.

L'utente non vede nulla. Possono fare ripetutamente clic e richiamare la chiamata Ajax, ma per loro l'app è semplicemente "morta".

Quindi, il mio pensiero è, c'è un modo per collegare un listener a tutte le chiamate ajax in JSF? Se è così, quello che mi piacerebbe fare è monitorare il codice di risposta. Se si tratta di un reindirizzamento, utilizzare un window.navigate per inviarli lungo la loro strada.

Sono sempre aperto per sentire come altri hanno risolto questo problema! Grazie!

+0

Wont [ "Stato iniziale di risparmio al server e sulla sessione di stato di trasferimento di timeout per cliente per tutto il tempo di risposta"] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server -on-session-timeout-transfer-to-client-per-tutti-t) essere una soluzione migliore per questo piuttosto che tutte queste cose hacky? Mi chiedo perché JSF non lo fornisce già e se posso in qualche modo implementarlo. –

risposta

16

C'è un modo per collegare un listener globale a tutte le chiamate AJAX in JSF? Forse attraverso un ascoltatore di fase o qualcosa del genere?

Sì, un PhaseListener può farlo. A SystemEventListener anche. A Filter anche.

Se si è all'interno del contesto JSF, è possibile verificare come segue se la richiesta corrente è una richiesta Ajax o meno.

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
    // It's an ajax request. 
} 

Se non si è all'interno del contesto JSF, ad es. all'interno di un Filter, quindi è possibile verificare come segue se la richiesta corrente è una richiesta Ajax JSF o meno.

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { 
    // It's a JSF ajax request. 
} 

Ecco l'enigma ... Diciamo che si sta utilizzando f: tag ajax e qualcosa come shiro apache e si lascia la sessione di scadenza. Quindi torni indietro e fai clic su un pulsante a cui è associata una f: ajax. Il server risponderà con un reindirizzamento 302 alla pagina di accesso.

L'utente non vede nulla. Possono fare ripetutamente clic e richiamare la chiamata Ajax, ma per loro l'app è semplicemente "morta".

Forzare un reindirizzamento su una richiesta Ajax richiede una risposta XML speciale. Quando ci si trova all'interno del contesto JSF, quindi ExternalContext#redirect() prende già implicitamente in considerazione questo. Tutto ciò che devi fare è scrivere questo:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

Se non sei all'interno del contesto JSF, ad es. all'interno di un Filter, quindi è necessario scrivere l'intera risposta XML da soli. Per esempio.

response.setContentType("text/xml"); 
response.getWriter() 
    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url); 
+0

TSo Sto indovinando il percorso ottimale è quello di scrivere un filtro che si trova di fronte al filtro Shiro. Quando Shiro invia un reindirizzamento, il mio filtro lo intercetterà e invierà l'XML. Ho la sensazione che non posso farlo all'interno dell'app facce perché Shiro bloccherà la richiesta. –

+0

La tua migliore scommessa è quindi un filtro davanti al filtro Shiro. – BalusC

+1

Per vostra informazione, ho bloggato esattamente su questo caso e fornito un filtro completo pronto all'uso per Shiro: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for- java-ee-6.html # MakeShiroJSFAjaxAware – BalusC

4

per reindirizzare una richiesta JSF Ajax è necessario XML come segue

<?xml version="1.0" encoding="UTF-8"?> 
<partial-response> 
     <redirect url="XXX"> 
     </redirect> 
</partial-response> 

Qui XXX è url che si desidera reindirizzare che accada.

Su un reindirizzamento di chiamata ajax inviato non è come sopra quindi nessun reindirizzamento.

Per ottenere il risultato desiderato avere un filtro per tutte le richieste JSF, tranne poche pagine (pagina di login) e controllare la sessione è valida e se è davvero JSF ajax chiamata controllando header "Faces-Request", la sua il valore deve essere "partial/ajax". Se la sessione è scaduta ed è richiesta ajax inviare sopra xml come risposta.

Dovrebbe funzionare.

+0

Wont ["Stato iniziale salvataggio sul server e sullo stato di trasferimento del timeout della sessione sul client per tutta la durata del tempo di risposta"] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server-on-session- timeout-transfer-to-client-per-tutti-t) essere una soluzione migliore a questo piuttosto che a tutte queste cose hacky? Mi chiedo perché JSF non lo fornisce già e se posso in qualche modo implementarlo. –

Problemi correlati