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 请求方法访问控制器动作,在使用不正确的 HTTP 方法时发送 405(方法不被允许)错误代码。
示例
描述
allowedMethods
属性提供了一个简单的声明语法来指定哪些 HTTP 方法被允许用于你的控制器动作。默认情况下,所有请求方法都被允许用于所有控制器动作。allowedMethods
属性是可选的,只在控制器有将动作限制于某些请求方法时才需要定义。
你可以在控制器动作中以编程方式进行这些检查,并自己发送一个 405 错误代码,但这往往会使控制器方法杂乱,而控制器方法应该更多地关注应用程序逻辑和路由。在更复杂的情况下,这种方法可能不足以应付,在这些情况下,可以自行处理事情。
allowedMethods
属性是一个映射,其中键是动作的名称,值是 String
或 String
的 List
。如果值为 String
,则它表示用于调用该动作的唯一请求方法。如果它是 String
的 List
,则它表示用于调用该动作的所有请求方法。如果违反指定限制,则在响应中返回 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
}
}