Cara Menangkap dan Log Kandungan Respons HTTP Servlet
Pengenalan
Melog kedua-dua permintaan dan kandungan tindak balas adalah penting untuk penyahpepijatan dan pemantauan sisi pelayan yang komprehensif. Walaupun mengakses parameter permintaan melalui penapis adalah mudah, mendapatkan semula kandungan respons boleh menjadi lebih mencabar. Artikel ini menerangkan cara membuat penapis yang memintas dan menyalin respons servlet untuk tujuan pengelogan.
Mencipta Penapis untuk Menangkap Kandungan Respons
Untuk menangkap kandungan respons, kita perlu mencipta Penapis tersuai yang membungkus objek HttpServletResponse dan mengatasi kaedah getOutputStream() dan getWriter(). Kaedah ini bertanggungjawab untuk menyediakan aliran untuk menulis data tindak balas. Dengan mengatasinya, kami boleh membuat strim tersuai yang memintas data dan menyalinnya ke dalam penimbal.
Berikut ialah contoh penapis yang melaksanakan tugas ini:
@WebFilter("/*") public class ResponseLogger implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response); try { chain.doFilter(request, responseCopier); responseCopier.flushBuffer(); } finally { byte[] copy = responseCopier.getCopy(); System.out.println(new String(copy, response.getCharacterEncoding())); } } }
Menyesuaikan Pembalut Respons
Kelas HttpServletResponseCopier membalut HttpServletResponse asal dan mencipta ServletOutputStream tersuai yang memintas data. Kaedah getOutputStream() dan getWriter() yang ditindih mencipta dan mengembalikan contoh ServletOutputStreamCopier.
public class HttpServletResponseCopier extends HttpServletResponseWrapper { private ServletOutputStreamCopier copier; @Override public ServletOutputStream getOutputStream() { if (copier == null) { copier = new ServletOutputStreamCopier(getResponse().getOutputStream()); } return copier; } @Override public PrintWriter getWriter() { if (copier == null) { copier = new ServletOutputStreamCopier(getResponse().getOutputStream()); } return new PrintWriter(new OutputStreamWriter(copier, getResponse().getCharacterEncoding()), true); } }
Memintas dan Menyalin Data Respons
Kelas ServletOutputStreamCopier int b) kaedah untuk memintas data yang ditulis kepada respons. Ia menulis data ke strim asal sambil turut menyalinnya ke dalam ByteArrayOutputStream untuk mendapatkan semula kemudian.
public class ServletOutputStreamCopier extends ServletOutputStream { private ByteArrayOutputStream copy; @Override public void write(int b) { outputStream.write(b); copy.write(b); } public byte[] getCopy() { return copy.toByteArray(); } }
Mendapatkan Maklum Balas Dirakam
Selepas kitaran permintaan-tindak balas telah selesai, penapis mendapatkan semula kandungan respons yang ditangkap daripada kaedah getCopy() ServletOutputStreamCopier. Data ini kemudiannya boleh digunakan untuk pembalakan atau sebarang tujuan lain yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap dan Log Kandungan Respons HTTP Servlet di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!