2011-03-21 4 views
0

내 Spring 애플리케이션에서 저는 org.springframework.web.filter.ShallowEtagHeaderFilter를 사용하여 ETags를 추가합니다. 정말 큰 데이터를 출력 할 때를 제외하고는 훌륭하게 작동합니다. 그런 다음 내 응용 프로그램에 메모리가 부족하여 JVM이 종료됩니다! 필터를 제거하면 모든 것이 잘 작동합니다.톰캣 필터 : 전체 앱에서 일부 URL 제외 -

하지만 ETag가 정말 좋으므로 몇 가지 URL 매핑을 제외하고 전체 서블릿을 필터링하는 필터 정의를 web.xml에 어떻게 만들 수 있습니까? 내 필터는 순간 다음과 같습니다

<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

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 
    } 

}