防止Grails控制器中的方法作为操作公开

防止Grails控制器中的方法作为操作公开,grails,groovy,grails-2.0,Grails,Groovy,Grails 2.0,我目前正在通读并使用中的示例 这本书是使用Grails1.2编写的 他们有一个代码示例,其中创建了一个debug()方法,该方法由beforeInterceptor调用,并解释说,由于debug()是一个方法,因此不会通过URL向用户公开。它们解释了闭包是作为控制器动作向最终用户公开的,而方法则不是 我还看到了,他们暗指一种常规方法: def auth() { ... } 被视为私有的,因为它是一个方法,而不是闭包。在Grails1.3中也是如此 但是,从Grails2.0.0开始 这让我想

我目前正在通读并使用中的示例

这本书是使用Grails1.2编写的

他们有一个代码示例,其中创建了一个
debug()
方法,该方法由
beforeInterceptor
调用,并解释说,由于
debug()
是一个方法,因此不会通过URL向用户公开。它们解释了闭包是作为控制器动作向最终用户公开的,而方法则不是

我还看到了,他们暗指一种常规方法:

def auth() { ... } 
被视为私有的,因为它是一个方法,而不是闭包。在Grails1.3中也是如此

但是,从Grails2.0.0开始

这让我想知道(并试图找到)一种方法来复制Grails2.0.0之前版本中提供的功能,即在控制器中创建一个不会向最终用户公开的方法

我想到了两种可能的方法,想知道哪种风格/实践更好,为什么

  • 将访问者设置为private,即
    private def auth()
  • 将方法的allowedMethods设置为空字符串:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""]
    
  • 这两种方法似乎都达到了预期的效果。然而,第一种方法给出HTTP错误代码404,第二种方法给出HTTP错误代码405


    有人知道哪种方法更可取吗?此外,是否有其他方法或“最佳实践技术”来实现这一点

    最好将其标记为private,因为404隐藏了405可以用来知道有一个函数调用它的任何东西。(这并不是说它会有多大用处。)


    另外,将方法标记为private也很好,因为它在方法上表明它不是一个动作。

    在Grails2.0中,任何标记为private或protected的方法都不被视为动作


    以这种方式标记一个方法对于维护来说会提供更多的信息,因为在方法声明中可以看到该方法是否可操作,而不必回顾
    allowedMethods
    变量。此外,如果一个不可访问的方法的声明被删除或没有添加到
    allowedMethods

    +1,那么它不会意外地被访问,不应该被公开的方法不应该被“公开”,而不是“不允许”。