El orden si importa: Setear cookies, luego hacer redirects (Grails).

Mi problema del día era muy simple, tenia que poder crear una cookie persistente (una que no se borrara al cerrar el explorador) y luego redirigir a otra página.

El primer problema fue como escribir una cookie en Grails. Por suerte no hay mucho misterio en esto, grails no nos ayuda en nada, así que hay que usar directamente el API de Servlets, pero afortunadamente desde un controller se tiene un acceso muy simple a los objetos request y response, por lo que no es complicado.

Básicamente hay que escribir lo siguiente:

        def cookie = new Cookie("nombreCookie", "valorCookie")
        cookie.maxAge = 86400 * 30 // 30 dias de vida, despues el explorador la desecha (la vida se expresa en segundos)
        cookie.path = '/'                      // para que la cookie funcione en toda la aplicacion

        response.addCookie(cookie)

Un prerequisito es hacer el import correspondiente:
import javax.servlet.http.Cookie

Ahora, si tienen buena suerte, con esto solo andará perfectamente. Pero si tienen la mala suerte que tengo yo, puede ser que la cookie no este funcionando. Si este es el caso, es probable que estén haciendo también un redirect a otro controller/action.

Si se hace el redirect después de setear la cookie, no hay problema, todo funcionará correctamente, pero por como venía la lógica de mi programa yo primero definía el redirect y después seteaba la cookie. Esto evidentemente no le gustaba, y la cookie era totalmente ignorada.

Esto NO funcionaría, a pesar de que ambas lineas son ejectuadas, porque en grails el redirect no es inmediato.

redirect(uri: "/")
response.addCookie(new Cookie("nombre", "valor"))

pero el siguiente código sí

response.addCookie(new Cookie("nombre", "valor"))
redirect(uri: "/")

Por lo tanto, recuerden siempre definir las cookies y después invocar a redirect.


Discussion Area - Leave a Comment