8 Stimmen

Tomcat doFilter() wurde mit einer bestätigten Antwort aufgerufen

Ich habe einen Tomcat-Filter, der Anfragen je nach URL an ein Behandlungsobjekt delegiert. Dies ist der einzige Filter in der FilterChain. Ich habe eine Ajax-App, die diesen Filter mit vielen Anfragen belastet.

Kürzlich habe ich ein Problem bemerkt, bei dem die doFilter-Methode des Filters oft mit einer verpflichteten Antwort als Parameter aufgerufen wird (intern ist es die gekennzeichnete coyote-Antwort).

Es scheint mir, dass dies nur passieren kann, wenn die Methode recycle() nicht auf diese coyote-Antwort aufgerufen wird. Ich habe überprüft, um sicherzustellen, dass ich keine Referenzen zu irgendwelchen Anfragen, Antworten, outputStream- oder Writer-Objekten behalte. Außerdem habe ich darauf geachtet, den outputStream in einem finally-Block zu schließen. Dies löst jedoch dieses Problem nicht.

Dies hört sich so an, als ob ich etwas mache, um den Servlet-Container zu missbrauchen, aber ich habe Schwierigkeiten, es zu finden.

4voto

Casey Watson Punkte 49136

Ich habe versucht, Tomcat 6.16 und 6.18 zu verwenden. Dies ist definitiv der einzige Filter in der Kette.

Es scheint, dass etwas eine Referenz zum Servlet-OutputStream behält. Ich habe den ServletOutputStream in meinen eigenen OutputStream eingewickelt und dann sicherzustellen, dass die Referenz zerstört wird. Dies hat das Problem behoben, sodass ich keine übergebene Antwort mehr sehe.

Dies ist eine seltsame Nebenwirkung des Halten einer Referenz. Ich denke jedoch nicht, dass es als Tomcat-Bug qualifiziert. Wahrscheinlicher ist ein Fehler in ImageIO.createImageOutputStream(), von dem ich vermute, dass er die Referenz hält.

0 Stimmen

Wir mussten genau dasselbe tun. Verpacken Sie den Ausgabestrom und verhindern Sie, dass er die Antwort bestätigt, bis wir bereit waren.

0voto

WMR Punkte 12231

Welche Version von Tomcat verwenden Sie? Für mich klingt dies nach einem Fehler in Tomcat. Ich kann mir keinen Grund vorstellen, warum Ihre doFilter-Methode mit einer bereits übermittelten Antwort aufgerufen werden sollte (wenn dieser Filter der einzige in der Kette ist, sind Sie sich sicher?).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X