Rumah > Java > javaTutorial > Bagaimana untuk Mengekalkan Parameter Badan POST dalam Servlet Java untuk Bacaan Berbilang?

Bagaimana untuk Mengekalkan Parameter Badan POST dalam Servlet Java untuk Bacaan Berbilang?

Mary-Kate Olsen
Lepaskan: 2024-11-30 22:42:11
asal
898 orang telah melayarinya

How to Preserve POST Body Parameters in Java Servlets for Multiple Reads?

Cara Mengekalkan Parameter Badan POST dalam Permintaan Servlet Http

Apabila bekerja dengan permintaan HTTP dalam servlet Java, adalah penting untuk mempertimbangkan kesan daripada mengakses parameter permintaan pada pemprosesan selanjutnya dalam rantai penapis. Secara lalai, membaca parameter daripada badan permintaan POST memakannya, menjadikannya tidak tersedia untuk penapis atau pengendali berikutnya.

Masalah: Mengambil Parameter Badan POST

Dalam servlet Java , parameter badan permintaan boleh diakses melalui request.getParameter(). Walau bagaimanapun, kaedah ini menggunakan inputStream dan oleh itu percubaan berikutnya untuk mendapatkan semula parameter akan gagal. Tingkah laku ini amat bermasalah untuk penapis yang perlu mengakses parameter sebelum ia digunakan oleh pengendali hiliran.

Penyelesaian: Memanjangkan HttpServletRequestWrapper

Untuk menangani isu ini, kita boleh lanjutkan HttpServletRequestWrapper untuk mencipta pelaksanaan permintaan tersuai yang menyimpan cache badan permintaan. Ini membolehkan kita membaca badan beberapa kali tanpa memakannya.

Berikut ialah contoh pelaksanaan:

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

    private ByteArrayOutputStream cachedBytes;

    public MultiReadHttpServletRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (cachedBytes == null) {
            cacheInputStream();
        }

        return new CachedServletInputStream(cachedBytes.toByteArray());
    }

    private void cacheInputStream() throws IOException {
        cachedBytes = new ByteArrayOutputStream();
        IOUtils.copy(super.getInputStream(), cachedBytes);
    }

    private static class CachedServletInputStream extends ServletInputStream {

        private final ByteArrayInputStream buffer;

        public CachedServletInputStream(byte[] contents) {
            this.buffer = new ByteArrayInputStream(contents);
        }

        @Override
        public int read() {
            return buffer.read();
        }

        // Implement other methods required by ServletInputStream interface, such as isFinished, isReady, setReadListener, etc.

    }
}
Salin selepas log masuk

Penggunaan:

Untuk mengekalkan POST parameter badan, kami boleh membungkus permintaan asal dalam MultiReadHttpServletRequest kami sebelum meneruskannya melalui penapis rantai:

public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        // Wrap the request to enable multiple reads of the request body
        MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

        // Read the request body for our own processing
        doMyThing(multiReadRequest.getInputStream());

        // Continue the filter chain with the wrapped request, allowing subsequent handlers to access the cached request body
        chain.doFilter(multiReadRequest, response);
    }
}
Salin selepas log masuk

Dengan menggunakan pendekatan ini, kami boleh mengakses parameter badan POST berbilang kali tanpa perlu risau untuk memakannya lebih awal.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Parameter Badan POST dalam Servlet Java untuk Bacaan Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan