防止Grails Controller中的方法作为操作公开

时间:2012-08-24 20:07:21

标签: grails groovy grails-2.0

我目前正在阅读Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph中的示例并进行操作。

这本书是用Grails 1.2编写的。

他们有一个代码示例,他们创建了一个由debug()调用的beforeInterceptor方法,并解释说,由于debug()是一种方法,因此不会通过URL向用户公开。他们解释说,Closures作为Controller Actions暴露给最终用户,但方法却没有。

我也在Grails 1.3 documentation上看到,他们提到常规方法:

def auth() { ... } 

被视为私有,因为它是一个方法,而不是一个闭包。这与Grails 1.3一样。

但是,从Grails 2.0.0开始,Controller Actions can be implemented as both methods and closures

这让我想知道(并试图找出)一种方法来复制Grails 2.0.0之前在Controller中创建方法时可用的功能,该方法不会暴露给最终用户。

我想到了两种可能的方法,并且想知道哪种风格/做法更好?为什么?

  1. 将访问者设置为私有,即private def auth()
  2. 为该方法设置allowedMethods以清空字符串:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""]
    
  3. 两种方法似乎都达到了预期的效果。但是,第一种方法是提供HTTP错误代码404,第二种方法提供HTTP错误代码405.

    有谁知道哪种方法更可取?此外,还有其他方法,或“最佳实践技术”吗?

2 个答案:

答案 0 :(得分:15)

在Grails 2.0中,任何标记为私有或受保护的方法都不被视为操作。

出于维护原因,以这种方式标记方法会提供更多信息,因为它在方法声明中是可见的,方法是否可操作而不必回顾allowedMethods变量。此外,如果删除声明或未将其添加到allowedMethods,则无法访问无法访问的方法。

答案 1 :(得分:4)

最好将其标记为私有,因为404隐藏了可以使用405的任何内容来知道有一个称为该函数的函数。 (并不是说它会有多大用处。)

同样将方法标记为私有很好,因为它在方法中显示它不是一个动作。