Filtrage d'une réponse

Il est également possible de filtrer une réponse à l'aide d'un filtre. Le déroulement des opérations est un peu plus délicat, car on doit dans ce cas fournir une réponse qui n'est pas la vraie réponse à la méthode doFilter().

Effectivement, fournir à cette méthode la vraie réponse pourrait donner la possibilité aux filtres suivants ou à la servlet finale, d'écrire directement dans le buffer de réponse, et de faire appel à sa méthode flush(), ce qui enverrait directement la réponse au navigateur client. On ne pourrait donc plus agir sur le contenu de la réponse.

L'idée consiste donc à fournir à la chaîne un buffer que l'on construit nous-mêmes, et dont on peut contrôler l'écriture dans le vrai buffer de réponse. Comme l'objet réponse que l'on doit passer en paramètre de doFilter() est de type ServletResponse, il nous faut construire une implémentation de cette classe.

Il ne s'agit bien sûr pas de réécrire l'intégralité de cette classe, juste d'intercepter ce que la servlet pourrait écrire dans le buffer de réponse. Pour cela, on peut surcharger la méthode getWriter() de façon à retourner un PrintWriter sur notre buffer, plutôt que sur le buffer de réponse.

Écrivons tout d'abord notre implémentation de ServletResponse.

Utilisons ensuite cette implémentation en filtrage.

Cet exemple reste assez basique. Si les méthodes qui interrogent la réponse vont fonctionner correctement, notre implémentation risque fort d'échouer si la servlet filtrée fait un appel à la méthode getOutputStream(), ou aux méthodes setContentType(), setCharacterEncoding(), ou encore sendError(). Il convient donc de le compléter avant de le mettre en production, ou de ne l'utiliser que dans des cas simples et parfaitement maîtrisés.