2009-03-20 21 views
17

Estoy desarrollando una aplicación de grillas que usa mucho ajax.Si la solicitud es una llamada ajax, entonces debe dar una respuesta (esta parte está funcionando), sin embargo, si escribo la URL en el navegador debería llevarme a la página de inicio/índice en lugar de a la página solicitada. A continuación se muestra el código gsp de muestra para la llamada ajax.Identificación de solicitud de Ajax o solicitud de navegador en el controlador de grails

<g:remoteFunction action="list" controller="todo" update="todo-ajax"> 

<div id ="todo-ajax"> 
//ajax call rendered in this area 
</div> 

si escribimos http://localhost:8080/Dash/todo/list en la barra de direcciones del navegador, el controlador debe redirigir a http://localhost:8080/Dash/auth/index

Cómo validar esta en el controlador.

Respuesta

34

Es una práctica bastante común para añadir este método dinámico en su cierre BootStrap.init:

HttpServletRequest.metaClass.isXhr = {-> 
     'XMLHttpRequest' == delegate.getHeader('X-Requested-With') 
    } 

esto le permite probar si la petición actual es una llamada ajax haciendo:

if(request.xhr) { ... } 

La solución más sencilla es añadir algo como esto a su acción TODO:

if(!request.xhr) { 
    redirect(controller: 'auth', action: 'index') 
    return false 
} 

Usted también podría usar filtros/interceptores. Creé una solución donde anoté todas las acciones que son ajax-only con una anotación personalizada, y luego validado esto en un filtro.

Ejemplo completo de griales-app/conf/BootStrap.groovy:

import javax.servlet.http.HttpServletRequest 

class BootStrap { 

    def init = { servletContext -> 

     HttpServletRequest.metaClass.isXhr = {-> 
      'XMLHttpRequest' == delegate.getHeader('X-Requested-With') 
     } 

    } 
    def destroy = { 
    } 
} 
+0

Hola Siegfried, me trató con su answer.I añadió primera parte en closure.It de arranque de inicio se da siguiente excepción Sin dicha propiedad: HttpServletRequest para la clase: BootStrap: groovy.lang.MissingPropertyException: Sin dicha propiedad: HttpServletRequest para la clase: BootStrap Podría ayudarme – DonX

+0

Indique su dirección de correo electrónico también – DonX

+2

Debe importar la clase javax.servlet.http.HttpServletRequest en su clase BootStrap. Agregaré un ejemplo completo a la respuesta. –

3

El método normal es hacer que la rutina ajax agregue un encabezado o una cadena de consulta a la solicitud y detectar eso. Si está utilizando una biblioteca para el ajax, probablemente ya lo proporcione.

Parece que está usando un prototipo, que agrega un X-Requested-With header set to 'XMLHttpRequest'; detectar esa es probablemente la mejor opción.

3

Desde Grails 1.1 una propiedad xhr se añadió al objeto request que le permite detectar peticiones AJAX. Un ejemplo de ello es el uso es el siguiente:

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
} 
Cuestiones relacionadas