2012-08-24 7 views
11

Actualmente estoy leyendo y trabajando los ejemplos en Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph.Evitar que el método en Grails Controller se exponga como acción

Este libro fue escrito usando Grails 1.2.

Tienen un ejemplo de código donde crean un método debug() que se llama por beforeInterceptor y explica que, dado que debug() es un método, no se expone al usuario a través de la URL. Explican que los cierres se exponen como acciones de controlador para el usuario final, pero los métodos no lo son.

También vi en el Grails 1.3 documentation, que aluden a un método regular:

def auth() { ... } 

siendo tratados como privada, ya que es un método, no un cierre. Lo cual era cierto a partir de Grails 1.3. Sin embargo, desde Grails 2.0.0, Controller Actions can be implemented as both methods and closures.

Esto me llevó a preguntarme (y tratar de averiguar) una forma de replicar la funcionalidad que está disponible en pre-Grails 2.0.0 de crear un método en un controlador que no se exponga al usuario final.

Pensé en 2 posibles enfoques y me preguntaba ¿cuál sería el mejor estilo/práctica y por qué?

  1. Configuración de acceso como privada, es decir private def auth()
  2. Configuración allowedMethods para el método de cadena vacía:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""] 
    

ambos enfoques parecían lograr el efecto deseado. Sin embargo, el primer enfoque da un código de error HTTP 404, y el segundo enfoque proporciona un código de error HTTP 405.

¿Alguien sabe qué enfoque sería preferible? Además, ¿hay algún otro enfoque o una "técnica de mejores prácticas" para hacerlo?

Respuesta

13

En Grails 2.0, los métodos marcados como privados o protegidos no se consideran acciones.

Marcar un método de esta manera sería más informativo por razones de mantenimiento, porque es visible en la declaración del método si el método es accionable en lugar de tener que mirar atrás en la variable allowedMethods. Además, un método inaccesible no se hará accidentalmente accesible si su declaración se elimina o no se agrega al allowedMethods.

4

Lo mejor es marcarlo como privado porque el 404 oculta que hay algo allí donde el 405 podría usarse para saber que había una función llamada así. (No es que sea de mucha utilidad).

También marcar el método private es bueno, ya que muestra en el método que no es una acción.

+2

+1, los métodos que no deberían exponerse simplemente no deberían estar "expuestos", no "no permitir". – shihpeng

Cuestiones relacionadas