我需要在每次調用控制器的def之前執行一個函數(在每個新請求發送到服務器之前)。在這個函數中,我將 1)做,如果有效的請求轉發給適當的動作&控制器與PARAMS 2)用戶做了消毒檢查提交PARAMS如何在將每個新請求提交給grails中的控制器之前執行某個功能
我知道每個控制器攔截器的會話確認如何,我可以寫一個全球通用的攔截器嗎?
如何以及在哪裏可以在Grails中調用此函數? 在此先感謝..
我需要在每次調用控制器的def之前執行一個函數(在每個新請求發送到服務器之前)。在這個函數中,我將 1)做,如果有效的請求轉發給適當的動作&控制器與PARAMS 2)用戶做了消毒檢查提交PARAMS如何在將每個新請求提交給grails中的控制器之前執行某個功能
我知道每個控制器攔截器的會話確認如何,我可以寫一個全球通用的攔截器嗎?
如何以及在哪裏可以在Grails中調用此函數? 在此先感謝..
您可以在Controller中使用beforeInterceptor以達到完全相同的目的。把它放到一個新的控制器中,稱爲BaseController,然後放入你想要做的所有東西,然後用BaseController擴展你現有的所有控制器,然後就可以開始了。有關beforeInterceptor Click here
注意更多信息:如果你已經有了一個被所有其他控制器擴展了一些常用的控制,沒有必要實施新的控制器。只需在該控制器中實現beforeInterceptor。
或者,您可以實施一個過濾器,並在該過濾器中執行所有操作。對於Grails的過濾器的更多信息Click Here
感謝Bala,現在我正在思考過濾器的問題我剛剛閱讀文檔,但是我怎樣才能爲AppStartupController(所有defs)以外的所有控制器製作過濾器,因爲會話將不可用在此控制器中,然後...然後在登錄控制器中進行身份驗證def(登錄控制器中的另一個def - 註銷def需要進行會話檢查)。如何寫這個過濾器? – 2012-03-27 02:17:19
您可以使用以下語法排除某些控制器。 filter1(controller:'book',invert:true){ }。 這將爲除書本控制器(BookController)以外的所有控制器請求執行filter1。 希望這會有所幫助。 – 2012-03-28 01:00:40
您可以按以下方式來攔截每個動作
class AbcFilters {
def filters = {
abc1(controller: '*', action: '*') {
}
abc2(controller: '*Test', action: '*') {
}
abc2(controllerExclude: 'AppStartup*', action: '*') {
}
}
}
這裏添加過濾器是在每個控制器的每一個動作一個過濾器:
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)
}
}
}
}
感謝您的幫助,我現在正在通過創建一個Abstract Base控制器來實現這一點,並且全部擴展它。在這我可以有將調用函數的beforeInterceptor。 – 2012-03-28 02:45:58
確定,我認爲過濾器雖然是一種更清潔的方式。 – dbrin 2012-03-28 05:11:44
http://grails.org/doc/lat est/guide/theWebLayer.html#filters – doelleri 2012-03-27 05:16:38