2008-09-05 6 views
7

J'ai un filtre Tomcat qui délègue des requêtes à un objet de gestion en fonction de l'URL. C'est le seul filtre du FilterChain. J'ai une application Ajax qui martèle ce filtre avec beaucoup de demandes.Tomcat doFilter() invoqué avec la réponse validée

Récemment, j'ai remarqué un problème où la méthode doFilter du filtre est souvent appelée avec une réponse validée en tant que paramètre (en interne, c'est la réponse de coyote qui est marquée commise).

Il me semble que la seule façon que cela peut arriver est si la méthode recycle() n'est pas appelée sur cette réponse de coyote. J'ai vérifié pour m'assurer que je ne garde aucune référence à l'un des objets request, response, outputStream ou writer. De plus, je me suis assuré de fermer le outputStream dans un bloc finally. Cependant, cela ne résout pas ce problème. Cela ressemble à quelque chose que je fais pour abuser du conteneur de servlet, mais j'ai du mal à le suivre.

Répondre

3

J'ai essayé d'utiliser Tomcat 6.16 et 6.18. C'est certainement le seul filtre de la chaîne.

Il semble que quelque chose garde une référence au servlet outputStream. J'ai enveloppé le ServletOutputStream dans mon propre OutputStream, puis j'ai vérifié que la référence était détruite. Cela a résolu le problème afin que je ne vois plus une réponse validée passée.

Il s'agit d'un effet secondaire impair de la tenue d'une référence. Mais je ne pense pas qu'il se qualifie comme un bug Tomcat. Plus probablement un bogue dans ImageIO.createImageOutputStream() que je soupçonne de contenir la référence.

+0

nous devions faire exactement la même chose. Envelopper le flux de sortie et l'empêcher de valider la réponse jusqu'à ce que nous soyons prêts. – ScArcher2

0

Quelle version de Tomcat utilisez-vous? Pour moi, cela ressemble à un bug dans Tomcat, je ne vois pas pourquoi votre méthode doFilter devrait être appelée avec une réponse qui a déjà été commise (si ce filtre est le seul dans la chaîne, êtes-vous sûr de cela?).

Questions connexes