我有一個當前定義的運行圖之後被渲染過濾器:Grails:視圖完全渲染後,是否有辦法運行過濾器?
class MyFilter {
def filters = {
doStuff(controller: '*', action: '*') {
before = {...}
after = {...}
afterView = {
// code I want to run when EVERYTHING is set and done }
Holder.setCurrentData(null)
}
}
}
這應該工作,但是我注意到,<g:message />
標籤(可能還有其他人,這是一個什麼在這一點上我感興趣)在afterView
過濾器後執行。
這是一個問題,因爲我使用此過濾器來跟蹤ThreadLocal中當前執行的一些信息,並且我希望確保在請求完成後自己清理完畢。我不想使用請求/會話對象來隨機播放數據,因爲那樣我必須將它傳遞給我所做的所有呼叫;實際上,我有一個Holder類,可以查詢ThreadLocal中的值。
我需要從我的自定義MessageSource中的ThreadLocal的信息。這就是我注意到<g:message />
是在afterView
過濾器之後調用的。
此解決方案正常工作。我對Grails沒有更好的處理方式感到失望,這感覺就像「滾動你自己」。你知道爲什麼'afterView'過濾器不能運行一旦視圖完全呈現,標籤和所有? –
Grails過濾器包裝Spring'HandlerInterceptor's,因此它們僅限於攔截控制器請求而不是靜態資源請求,並且也只有與「HandlerInterceptor」相同的回調。 –
謝謝。這解釋了它。 –