Rumah >Java >javaTutorial >Mengapa Permintaan Servlet Http Saya Hilang Parameter Badan POST Selepas Sekali Baca?

Mengapa Permintaan Servlet Http Saya Hilang Parameter Badan POST Selepas Sekali Baca?

Susan Sarandon
Susan Sarandonasal
2024-11-27 18:00:17867semak imbas

Why Does My Http Servlet Request Lose POST Body Parameters After a Single Read?

Http Servlet Request Kehilangan Param daripada POST Body Selepas Dibaca Sekali

Dalam situasi ini, adalah penting untuk memahami bahawa apabila berurusan dengan permintaan POST , parameter biasanya dihantar dalam badan permintaan. Secara lalai, bekas Servlet menggunakan aliran aksara input atau aliran binari apabila parameter diakses buat kali pertama. Akibatnya, percubaan berikutnya untuk mengaksesnya dalam rantai penapis gagal.

Untuk mengatasi isu ini, terdapat dua pendekatan utama yang perlu dipertimbangkan:

1. Komponen Pemintas:

Sebagai alternatif kepada penggunaan rantai penapis, anda boleh menggunakan komponen pemintas. Komponen ini boleh dilaksanakan menggunakan aspek dan membenarkan pengendalian badan permintaan yang dihuraikan tanpa bergantung pada InputStream permintaan yang digunakan. Pendekatan ini biasanya lebih cekap kerana permintaan InputStream hanya dihuraikan sekali untuk mencipta objek model anda sendiri.

2. HttpServletRequestWrapper:

Untuk kes di mana rantaian penapis diutamakan pada lapisan HTTP, melanjutkan HttpServletRequestWrapper ialah kaedah yang berkesan. Teknik ini melibatkan penggunaan InputStream permintaan dan caching bait:

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

    @Override
    public BufferedReader getReader() throws IOException{
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    private void cacheInputStream() throws IOException {
        /* Cache the inputstream in order to read it multiple times. For
         * convenience, I use apache.commons IOUtils
         */
        cachedBytes = new ByteArrayOutputStream();
        IOUtils.copy(super.getInputStream(), cachedBytes);
    }

    /* An input stream which reads the cached request body */
    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();
        }

        @Override
        public boolean isFinished() {
            return buffer.available() == 0;
        }

        @Override
        public boolean isReady() {
            return true;
        }

        @Override
        public void setReadListener(ReadListener listener) {
            throw new RuntimeException("Not implemented");
        }
    }
}

Dengan membungkus permintaan asal dengan MultiReadHttpServletRequest sebelum meneruskannya melalui rantai penapis, badan permintaan boleh dibaca beberapa kali. Ambil perhatian bahawa penyelesaian ini juga memudahkan pembacaan berbilang melalui kaedah getParameterXXX.

Edit:

Untuk versi lebih baharu antara muka ServletInputStream, kaedah tambahan seperti isReady dan setReadListener perlu dilaksanakan. Rujuk soalan ini untuk maklumat lanjut.

Atas ialah kandungan terperinci Mengapa Permintaan Servlet Http Saya Hilang Parameter Badan POST Selepas Sekali Baca?. 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