Tomcat doFilter() вызывается с зафиксированным ответом
Вопрос
У меня есть фильтр Tomcat, который делегирует запросы объекту обработки в зависимости от URL-адреса.Это единственный фильтр в FilterChain
.У меня есть приложение Ajax, которое забивает этот фильтр множеством запросов.
Недавно я заметил проблему, из-за которой фильтр doFilter
Метод часто вызывается с зафиксированным ответом в качестве параметра (внутренне это ответ койота, помеченный как зафиксированный).
Мне кажется, что это может произойти только в том случае, если recycle()
метод не вызывается для этого ответа койота.Я проверил, чтобы убедиться, что я не сохраняю ссылки ни на один из объектов запроса, ответа, потока вывода или записи.Кроме того, я позаботился о том, чтобы закрыть выходной поток в блокеfinally.Однако это не решает проблему.
Похоже, я делаю что-то, чтобы злоупотребить контейнером сервлетов, но у меня возникли проблемы с его отслеживанием.
Решение
Я пробовал использовать Tomcat 6.16 и 6.18.Это определенно единственный фильтр в цепочке.
Кажется, что-то сохраняет ссылку на выходной поток сервлета.Я завернул ServletOutputStream в свой собственный OutputStream, а затем убедился, что ссылка уничтожена.Это устранило проблему, и я больше не вижу переданного подтвержденного ответа.
Это странный побочный эффект хранения ссылки.Но я не думаю, что это можно квалифицировать как ошибку Tomcat.Скорее всего, это ошибка в ImageIO.createImageOutputStream(), которая, как я подозреваю, содержит ссылку.
Другие советы
Какую версию Tomcat вы используете?Для меня это звучит как ошибка в Tomcat, я не могу придумать никакой причины, по которой ваш метод doFilter должен вызываться с уже зафиксированным ответом (если этот фильтр является единственным в цепочке, вы уверены в этом? ).