2008-09-05 2 views
7

URL에 따라 처리 객체에 요청을 위임하는 Tomcat 필터가 있습니다. 이것은 FilterChain에있는 유일한 필터입니다. 많은 요청으로이 필터를 망치는 Ajax 앱이 있습니다.Tomcat doFilter()가 커밋 된 응답으로 호출 됨

최근 필터의 doFilter 메서드가 커밋 된 응답을 매개 변수로 사용하여 호출되는 문제가 발생했습니다 (내부적으로 커밋 된 것으로 표시된 코요테 응답).

이것이 일어날 수있는 유일한 방법은이 코요테 응답에 recycle() 메서드가 호출되지 않은 것입니다. request, response, outputStream 또는 writer 객체에 대한 참조를 유지하고 있지 않은지 확인했습니다. 또한 finally 블록에서 outputStream을 닫아야합니다. 그러나이 방법으로는이 문제가 해결되지 않습니다.

서블릿 컨테이너를 잘못 남용하고있는 것처럼 들리지만 문제를 추적하는 데 어려움이 있습니다.

답변

3

Tomcat 6.16 및 6.18을 사용해 보았습니다. 이것은 확실히 체인의 유일한 필터입니다.

뭔가가 서블릿 outputStream에 대한 참조를 유지하고있는 것으로 보입니다. 내 자신의 OutputStream에 ServletOutputStream을 래핑 한 다음 참조가 삭제되었는지 확인했습니다. 이로 인해 전달 된 커밋 된 응답이 더 이상 볼 수 없도록 문제가 해결되었습니다.

이것은 참조를 보유하는 이상한 부작용입니다. 하지만 Tomcat 버그로 간주하지 않습니다. 가능성이 더 높습니다 ImageIO.createImageOutputStream() 버그를 참조하는 것으로 생각됩니다.

+0

우리는 똑같은 일을해야했습니다. 출력 스트림을 랩핑하고 준비가 완료 될 때까지 응답을 커밋하지 못하도록합니다. – ScArcher2

0

어떤 Tomcat 버전을 사용하고 있습니까? 나에게 이것은 Tomcat의 버그처럼 들린다. 나는 doFilter 메소드가 이미 커밋 된 응답으로 호출되어야하는 이유를 생각할 수 없다. (만약 그 필터가 체인에있는 유일한 필터라면 이것에 대해 확신 할 수 있는가?).