2011-09-15 10 views
9

Il mio validatore deve sapere se si tratta di una richiesta completa o di una richiesta Ajax. Nella mia soluzione attuale a verificare l'intestazione di richiesta HTTP per l'elemento X-Requested-With:Distinguere richieste Ajax da richieste complete nel validatore personalizzato JSF

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest(); 
     if (req.getHeader("X-Requested-With") != null) { 
      // do something 
     } else { 
      // do something else 
     } 
     ... 
} 

C'è un approccio migliore per raggiungere questo obiettivo? La mia soluzione è "sicura" rispetto ai diversi browser/librerie javascript?

UPDATE:

appena scoperto che il X-richiesta-Con intestazione è presente solo se la richiesta Ajax deriva dalla libreria dei componenti primefaces (il tag <p:ajax>).

È non presente se utilizzo JSF normale <f:ajax>. Quindi il mio approccio non funzionerà con<f:ajax>.

Utilizzando <f:ajax> c'è una diversa intestazione:

Faces-Request:partial/ajax 

La soluzione proposta da Osw lavora per <f:ajax>e<p:ajax>:

PartialViewContext#isAjaxRequest()

risposta

14

non vorrei contare su di intestazione http. Mai provato da solo, ma si poteva fare quanto segue:

PartialViewContext pvc = facesContext.getPartialViewContext(); 
if(pvc.isAjaxRequest()) { 
// ... 
} else { 
// ... 
} 

Un'altra opzione sta usando isPartialRequest() invece di isAjaxRequest()

+0

Grazie per la risposta. Suona bene. Sai cosa fa il metodo? Forse controlla anche le intestazioni. –

+0

@Matt, mi spiace, non ho idea di cosa faccia esattamente, ma le opzioni stanno controllando le intestazioni o controllando la mappa dei parametri della richiesta. – Osw

+0

Ho aggiornato la mia domanda. Sembra che la mia soluzione non sia sicura. –

1

avevo che si tratta di un modo affidabile per controllarlo Questo è esattamente come per esempio Django verifica la presenza di richieste AJAX:

def is_ajax(self): 
     return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' 

anche elencati qui in quanto tale: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

+0

Grazie per la risposta. Aggiornate le mie domande. Sembra che la mia soluzione non sia sicura. –

Problemi correlati