(快速参考)

allowedMethods

目的

限制基于 HTTP 请求方法访问控制器动作,在使用不正确的 HTTP 方法时发送 405(方法不被允许)错误代码。

示例

class PersonController {
    // action1 may be invoked from a POST
    // action2 has no restrictions
    // action3 may be invoked from a POST or DELETE
    static allowedMethods = [action1:'POST',
                             action3:['POST', 'DELETE']]
    def action1() { ... }
    def action2() { ... }
    def action3() { ... }
}

描述

allowedMethods 属性提供了一个简单的声明语法来指定哪些 HTTP 方法被允许用于你的控制器动作。默认情况下,所有请求方法都被允许用于所有控制器动作。allowedMethods 属性是可选的,只在控制器有将动作限制于某些请求方法时才需要定义。

你可以在控制器动作中以编程方式进行这些检查,并自己发送一个 405 错误代码,但这往往会使控制器方法杂乱,而控制器方法应该更多地关注应用程序逻辑和路由。在更复杂的情况下,这种方法可能不足以应付,在这些情况下,可以自行处理事情。

allowedMethods 属性是一个映射,其中键是动作的名称,值是 StringStringList。如果值为 String,则它表示用于调用该动作的唯一请求方法。如果它是 StringList,则它表示用于调用该动作的所有请求方法。如果违反指定限制,则在响应中返回 405 错误代码。

例如,此代码阻止使用 HTTP GET 调用 delete 动作

class PersonController {
    def delete() {
        if (request.method == 'GET') {
            // redirect to the list action
            redirect(action: list)
        } else {
            // the rest of the delete action goes here
        }
    }
}

它可以返回 405 错误代码而不是重定向

class PersonController {
    def delete() {
        if (request.method == 'GET') {
            response.sendError(405)
        } else {
            // the rest of the delete action goes here
        }
    }
}

但最简洁的解决方案是使用 allowedMethods

class PersonController {

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

    def delete() {
        // the delete logic goes here
    }
}