java ajax grails gsp

java - Identificación de solicitud ajax o solicitud de navegador en el controlador grails



gsp (3)

Estoy desarrollando una aplicación Grails que usa mucho ajax. Si la solicitud es ajax call, debería responder (esta parte funciona), sin embargo, si escribo la URL en el navegador, debería ir a la página de inicio / índice. en lugar de la página solicitada. A continuación se muestra el código gsp de ejemplo para la llamada ajax.

<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 URL del navegador, el controlador debe redirigir a http://localhost:8080/Dash/auth/index

Cómo validar esto en el controlador.


Desde Grails 1.1, se agregó una propiedad xhr al objeto de request que le permite detectar solicitudes AJAX. Un ejemplo de su uso es a continuación:

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


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

Parece que estás usando prototype, que agrega un encabezado X-Requested-With establecido en ''XMLHttpRequest'' ; Detectar esa es probablemente tu mejor apuesta.


Es una práctica bastante común agregar este método dinámico en el cierre de BootStrap.init:

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

esto le permite probar si la solicitud actual es una llamada ajax haciendo:

if(request.xhr) { ... }

La solución más sencilla es agregar algo como esto a su acción de tareas pendientes:

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

También puedes usar filtros / interceptores. He construido una solución donde anoté todas las acciones que son solo ajax con una anotación personalizada, y luego validé esto en un filtro.

Ejemplo completo de grails-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 = { } }