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
Mary-Kate Olsenasal
2024-11-30 22:42:11899semak imbas

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.

    }
}

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);
    }
}

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!

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