2011-03-21 35 views
0

在我的Spring應用程序中,我使用org.springframework.web.filter.ShallowEtagHeaderFilter添加ETags。這很好,除非我輸出真正的大數據。然後我的應用程序耗盡內存並終止JVM!如果我刪除過濾器,一切都很好。Tomcat過濾器:適用於整個應用程序減去一些URL

但我真的很喜歡有ETags,所以我怎麼能在web.xml中創建一個過濾器定義來過濾除少數URL映射以外的整個servlet呢?我的過濾器看起來像這樣的時刻:

<filter> 
    <filter-name>etagFilter</filter-name> 
    <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>etagFilter</filter-name> 
    <servlet-name>MyWebApp</servlet-name> 
</filter-mapping> 

乾杯

回答

3

有沒有辦法做到這一點聲明。我想你需要重寫它的doFilter()並根據請求屬性以編程方式作出決定。

+0

好吧,我這樣做,那是相當快的,所以沒有問題我不能」不要聲明。有點令人驚訝,但 – niklassaers 2011-03-21 14:06:00

1

OncePerRequestFilter有一個名爲shouldNotFilter()的方法,您可以重寫以執行此操作。

我正在做一些類似的過濾器。下面是一個簡單的web.xml片段:

<filter> 
    <filter-name>hibernateFilter</filter-name> 
    <filter-class>com.xyz.config.OpenSessionInViewFilter</filter-class> 
    <init-param> 
     <param-name>excludePaths</param-name> 
     <param-value>/js:/log/</param-value> 
    </init-param> 
</filter> 

和過濾器是:

class OpenSessionInViewFilter extends org.springframework.orm.hibernate3.support.OpenSessionInViewFilter { 
    @BeanProperty var excludePaths: String = null 
    val excludePathList = new mutable.ArrayBuffer[String] 

    override def initFilterBean { 
    if (excludePaths != null) { 
     excludePaths.split(':').foreach(excludePathList += _) 
    } 
    super.initFilterBean 
    } 

    override def shouldNotFilter(request: HttpServletRequest) = { 
    val httpServletRequest = request.asInstanceOf[HttpServletRequest] 
    val servletPathInfo = httpServletRequest.getServletPath + httpServletRequest.getPathInfo 
    excludePathList.exists(p => servletPathInfo.startsWith(p)) || DataConfig.noDB 
    } 

}

相關問題