2012-04-06 44 views
1

,以確保所有的表單提交,並提交給服務器的所有數據不通過GET我發現這段代碼確保沒有請求是通過應用GET方法

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

我們可以在應用此由所有控制器擴展出來的基本控制器,因此代碼不會在任何地方重複。 以上方法檢查現有方法 我想知道是否有一種方法可以在整個應用程序中將方法設置爲POST,就像所有表單一樣,並且所有提交的數據都應該是POST。任何配置/變量我用來設置?
由於提前
Priyank

回答

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 
     } 
    } 
} 

而且除了豎線分隔的動作名稱(你可以做控制器名稱相同)你也可以使用通配符,因此您可以添加任何以「創建」開頭的操作:

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

感謝Burt提供的解決方案。是的,我們打算從基本控制器轉移到過濾器,但我們仍然在基本控制器中有一些其他調用,例如清理器插件調用請求中的所有參數,等等。現在我們無法取出baseController。在一些不相關的問題上,我想知道是否有人成功將HDIV API集成到Grails中 – 2012-04-07 20:19:05