通过应用程序中的GET方法确保没有请求

时间:2012-04-06 22:28:05

标签: grails block http-get

为了确保所有表单提交和提交给服务器的所有数据都不是通过GET我找到了这段代码

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

我们可以在所有控制器扩展的基本控制器中应用它,因此代码不会在任何地方重复。 上述方法检查现有方法 我想知道有没有办法在整个应用程序中将方法设置为POST,就像所有表单一样,所有提交的数据都应该由POST提供。我用来设置这个的任何配置/变量?
在此先感谢您 Priyank

1 个答案:

答案 0 :(得分:4)

一般情况下,这是allowedMethods地图的用途;当您使用generate-controllergenerate-all脚本时,您的控制器将具有此功能:

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

您可以在地图中添加或删除操作名称,具体取决于哪些操作需要POST以及哪些操作允许GET。您可以将它放在基类中,并允许子类重用基类定义并使用此方法添加到它:

static allowedMethods = BaseController.allowedMethods + [createUser: "POST"]

这要求您扩展该基类,因此很容易忘记。所以更好的方法可能是使用过滤器;您可以使用create-filters命令创建一个。

因此,例如,您可以使用这样的过滤器,并显示要禁止的操作列表:

def filters = {
   postOnly(controller:'*', action: 'save|update|delete') {
      before = {
         if (!request.post) {
            response.sendError(405)
            return false
         }
         true
      }
   }
}

除了管道分隔的操作名称(您可以对控制器名称执行相同操作)之外,您还可以使用通配符,因此您可以添加以“create”开头的任何操作:

   postOnly(controller:'*', action: 'save|update|delete|create*') {