2011-09-15 20 views
9

Mi validador necesita saber si se trata de una solicitud completa o una solicitud ajax. En mi solución actual puedo comprobar el encabezado de solicitud HTTP para el elemento X-Requested-With:Distingue las solicitudes ajax de las solicitudes completas en el validador personalizado 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 
     } 
     ... 
} 

¿Hay un mejor enfoque para lograr esto? ¿Mi solución es "segura" con respecto a diferentes navegadores/librerías de JavaScript?

UPDATE:

acaba de descubrir que el X-Requested-With cabecera sólo está presente si la petición ajax proviene de la biblioteca de componentes Primefaces (la etiqueta <p:ajax>).

Es no presente si utilizo JSF <f:ajax> llano. Así que mi enfoque no funcionará con<f:ajax>.

Usando <f:ajax> hay una cabecera diferente:

Faces-Request:partial/ajax 

La solución propuesta por Osw trabaja para <f:ajax>y<p:ajax>:

PartialViewContext#isAjaxRequest()

Respuesta

14

yo no depender de cabecera HTTP. Nunca había probado por mí mismo, pero que podría ser la siguiente:

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

Otra opción es usar en lugar de isPartialRequest()isAjaxRequest()

+0

Gracias por su respuesta. Suena bien. ¿Sabes lo que hace el método? Tal vez solo busca encabezados también. –

+0

@Matt, lo siento, no tengo idea de lo que hace exactamente, pero las opciones son comprobar los encabezados o verificar el mapa de parámetros de solicitud. – Osw

+0

He actualizado mi pregunta. Parece que mi solución no es segura. –

1

que había que se trata de una forma fiable para verificarlo Así es exactamente como, por ejemplo, Django comprueba si hay peticiones AJAX:

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

También figuran aquí como tales: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

+0

Gracias por su respuesta. Actualicé mis preguntas Parece que mi solución no es segura. –

Cuestiones relacionadas