2011-04-14 91 views
3

我正在將老派的Java過濾器轉換爲Grails過濾器。 (該過濾器正在記錄對特定靜態圖像的訪問。)帶靜態資源的Grails過濾器?

問題是,我無法啓動它! Grails是否支持靜態資源之前的過濾器?

class EmailImageFilters { 
    def filters = { 
     emailFilter(uri: '/images/**') { 
      log.info "email filter ${new Date()}" 
      before = { 
       return true; 
      } 
     } 
    } 
} 

我現在用的是UIPerformance插件,但它不是在發展模式已開啓。

的Grails 1.3.5

我能得到它開火時:

emailFilter(controller: '*', action: '*') { 

,但我需要它是通過靜態資源;例如/ images

建議?

回答

10

靜態資源不由控制器提供,因此Grails過濾器(它們是Spring控制器攔截器的包裝器)不會因請求而觸發。您需要在web.xml中註冊一個servlet過濾器來處理靜態資源。

創建的src/java或實現javax.servlet.Filter的src/Groovy的一類,然後運行grails install-templates和編輯src/templates/war/web.xml進行註冊,像

<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>com.mycompany.myapp.MyFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

更改URL模式的價值是,如果更具體你不希望它爲所有請求開火。

+0

Thanks Burt。這就是我現在在src/groovy和更新的web.xml中所具有的。但我不相信我可以訪問此過濾器中的注入日誌,數據源和GORM對象。這就是爲什麼我想要遷移到Grails過濾器。 – 2011-04-14 20:45:47

+1

沒有自動注入記錄器,但可以使用常規方法,即Logger.getLogger(getClass())。您可以通過ApplicationHolder.application.mainContext.dataSource訪問Spring bean,如dataSource。如果你從Groovy調用,GORM方法應該可以工作,儘管你可能需要包裝在withTransaction塊中以避免延遲加載異常,因爲你不在OpenSessionInViewInterceptor的範圍內。 – 2011-04-14 20:57:25