Rumah  >  Artikel  >  Java  >  Bagaimana untuk Menangkap dan Log Kandungan Respons HTTP Servlet di Java?

Bagaimana untuk Menangkap dan Log Kandungan Respons HTTP Servlet di Java?

DDD
DDDasal
2024-11-11 10:16:02494semak imbas

How to Capture and Log HTTP Servlet Response Content in Java?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn