Capture et journalisation du contenu du flux de sortie de la réponse du servlet HTTP
Dans les serveurs Web Java, vous pouvez rencontrer des situations dans lesquelles vous devez enregistrer à la fois la requête entrante paramètres et la réponse du serveur qui en résulte. Cet article fournit une solution pour obtenir le contenu du flux de sortie de réponse du servlet HTTP à des fins de journalisation.
Pour y parvenir, vous pouvez utiliser un filtre pour envelopper l'objet HttpServletResponse avec une implémentation personnalisée appelée HttpServletResponseWrapper. Dans ce wrapper, nous remplaçons les méthodes getOutputStream() et getWriter() pour renvoyer une implémentation personnalisée de ServletOutputStream, ServletOutputStreamCopier.
Le ServletOutputStreamCopier encapsule le flux de sortie d'origine et copie les octets écrits dans un ByteArrayOutputStream, accessible sous forme d'octet[ ] via la méthode getCopy().
Une fois le wrapper de réponse personnalisé en place, nous le transmettons à l'appel FilterChain#doFilter(). Une fois le cycle requête-réponse terminé, nous récupérons le contenu de la réponse copié à partir du ServletOutputStreamCopier pour la journalisation.
Voici un exemple d'implémentation d'un tel filtre :
public class ResponseLogger implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { if (response.getCharacterEncoding() == null) { response.setCharacterEncoding("UTF-8"); } HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response); chain.doFilter(request, responseCopier); responseCopier.flushBuffer(); byte[] copy = responseCopier.getCopy(); System.out.println(new String(copy, response.getCharacterEncoding())); } }
Cette implémentation de filtre capture la réponse sortie sous forme de tableau d'octets, vous permettant de gérer la journalisation ou tout autre traitement nécessaire.
Les extraits de code pour HttpServletResponseCopier et ServletOutputStreamCopier sont également fournis pour compléter la solution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!