iberck
9/15/2015 - 3:39 AM

Redirect after post

Redirect after post

Grails sin Redirect after post

A continuación se presenta el modelo tradicional de programación sin el patrón de diseño Redirect After Post.

  1. El usuario invoca un controlador/accion desde el browser, por ejemplo:
    http://localhost/sigrem/hotel/save

  2. Dicha acción renderiza una página:

class HotelController {
    def save() {
        render view:'list'
    }
}
  1. Se renderiza el contenido de la página list en el browser.
  2. La barra de direcciones queda con: http://localhost/sigrem/hotel/save porque la acción save renderizó el contenido de la página list, pero sobre la misma acción solicitada.
  3. F5 en el browser provoca se vuelva a guardar el hotel.

Grails con Redirect After Post:

  1. El usuario invoca un controlador/accion desde el browser, por ejemplo:
    http://localhost/sigrem/hotel/save

  2. Dicha acción invoca otra acción con redirect (es quien aplica el patrón de diseño):

class HotelController {
    def save() {
        redirect action:'list'
    }
}
  1. Se invoca la acción list la cual a su vez renderiza el contenido de la página list.gsp:
class HotelController {
    def list() {
        render view:'list'
    }
}
  1. Ahora la barra de direcciones del browser queda con la dirección: http://localhost/sigrem/hotel/list
  2. F5 en el browser provoca se refresque la vista list y no lance ninguna operación sobre el browser.

El patrón de diseño además de prevenir se lancen acciones repetidas con f5, permite hacer bookmarking de las páginas (página que se muestra, es página que corresponde a la url del navegador).

Redirect After post a nivel http

Redirect After post y flash scope

Patrón de diseño aplicado

En general la recomendación es siempre hacer un redirect después de un post (envío de formulario) que modifica el estado de la aplicación por si el usuario presiona f5 no se vuelva a lanzar la acción.

Referencia

http://stackoverflow.com/questions/1354719/grails-controller-methods