0

在我的 Spring 应用程序中,我使用 org.springframework.web.filter.ShallowEtagHeaderFilter 添加 ETag。这很好用,除非我输出非常大的数据。然后我的应用程序内存不足并终止 JVM!如果我删除过滤器,一切都会很好。

但我真的很喜欢使用 ETag,那么如何在 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>

干杯

尼克

4

2 回答 2

3

没有办法以声明方式进行。我想您需要覆盖它doFilter()并根据请求属性以编程方式做出决定。

于 2011-03-21T12:36:53.983 回答
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
  }

}

于 2011-03-21T13:32:30.830 回答