2012-03-27 46 views
4

我需要在每次調用控制器的def之前執行一個函數(在每個新請求發送到服務器之前)。在這個函數中,我將 1)做,如果有效的請求轉發給適當的動作&控制器與PARAMS 2)用戶做了消毒檢查提交PARAMS如何在將每個新請求提交給grails中的控制器之前執行某個功能

我知道每個控制器攔截器的會話確認如何,我可以寫一個全球通用的攔截器嗎?

如何以及在哪裏可以在Grails中調用此函數? 在此先感謝..

+0

http://grails.org/doc/lat est/guide/theWebLayer.html#filters – doelleri 2012-03-27 05:16:38

回答

6

您可以在Controller中使用beforeInterceptor以達到完全相同的目的。把它放到一個新的控制器中,稱爲BaseController,然後放入你想要做的所有東西,然後用BaseController擴展你現有的所有控制器,然後就可以開始了。有關beforeInterceptor Click here

注意更多信息:如果你已經有了一個被所有其他控制器擴展了一些常用的控制,沒有必要實施新的控制器。只需在該控制器中實現beforeInterceptor。

或者,您可以實施一個過濾器,並在該過濾器中執行所有操作。對於Grails的過濾器的更多信息Click Here

+0

感謝Bala,現在我正在思考過濾器的問題我剛剛閱讀文檔,但是我怎樣才能爲AppStartupController(所有defs)以外的所有控制器製作過濾器,因爲會話將不可用在此控制器中,然後...然後在登錄控制器中進行身份驗證def(登錄控制器中的另一個def - 註銷def需要進行會話檢查)。如何寫這個過濾器? – 2012-03-27 02:17:19

+0

您可以使用以下語法排除某些控制器。 filter1(controller:'book',invert:true){ }。 這將爲除書本控制器(BookController)以外的所有控制器請求執行filter1。 希望這會有所幫助。 – 2012-03-28 01:00:40

4

您可以按以下方式來攔截每個動作


class AbcFilters { 
def filters = { 
    abc1(controller: '*', action: '*') { 
    } 

    abc2(controller: '*Test', action: '*') { 
    } 


    abc2(controllerExclude: 'AppStartup*', action: '*') { 

    } 
} 
} 
3

這裏添加過濾器是在每個控制器的每一個動作一個過濾器:

all(controller: '*', action: '*') { 
    before = { 

    } 
    after = { 

    } 
    afterView = { 

    } 
} 

這裏一個使用彈簧安全性的會話檢查過濾器:

 auditEntry(controller:'*', action:'*') { 
      before = { 
       if (session.isNew()){ 
        def userName 
        def principal = SCH?.context?.authentication?.principal 
        if (principal instanceof String){ 
         userName = principal 
         log.info "Anonymous user has logged into the application." 
        }else{ 
         userName = principal?.username 
         log.info "User $userName has logged into the application." 
         log.debug (principal) 
        } 
       } 
      } 
     } 
+0

感謝您的幫助,我現在正在通過創建一個Abstract Base控制器來實現這一點,並且全部擴展它。在這我可以有將調用函數的beforeInterceptor。 – 2012-03-28 02:45:58

+0

確定,我認爲過濾器雖然是一種更清潔的方式。 – dbrin 2012-03-28 05:11:44

相關問題