Фильтры Tomcat: действительно для всего приложения, за исключением некоторых URL - PullRequest
0 голосов
/ 21 марта 2011

В моем приложении Spring я использую org.springframework.web.filter.ShallowEtagHeaderFilter для добавления ETag. Это прекрасно работает, кроме случаев, когда я вывожу ДЕЙСТВИТЕЛЬНО большие данные. Тогда моему приложению не хватает памяти и завершает работу JVM! Если я уберу фильтр, все будет отлично.

Но мне действительно нравится иметь ETag, так как я могу сделать определение фильтра в web.xml, который фильтрует весь сервлет, за исключением нескольких отображений URL? Мой фильтр выглядит следующим образом:

<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>

Приветствия

Nik

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Нет способа сделать это декларативно.Я думаю, вам нужно переопределить его doFilter() и принять решение программно на основе свойств запроса.

1 голос
/ 21 марта 2011

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
  }

}

...