


Mengapa Permintaan Servlet Http Saya Hilang Parameter Badan POST Selepas Sekali Baca?
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Penyelesaian masalah dan penyelesaian kepada perisian keselamatan syarikat yang menyebabkan beberapa aplikasi tidak berfungsi dengan baik. Banyak syarikat akan menggunakan perisian keselamatan untuk memastikan keselamatan rangkaian dalaman. …

Penyelesaian untuk menukar nama kepada nombor untuk melaksanakan penyortiran dalam banyak senario aplikasi, pengguna mungkin perlu menyusun kumpulan, terutama dalam satu ...

Pemprosesan pemetaan medan dalam dok sistem sering menemui masalah yang sukar ketika melaksanakan sistem dok: bagaimana untuk memetakan medan antara muka sistem dengan berkesan ...

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Apabila menggunakan Mybatis-Plus atau Rangka Kerja ORM yang lain untuk operasi pangkalan data, sering diperlukan untuk membina syarat pertanyaan berdasarkan nama atribut kelas entiti. Sekiranya anda secara manual setiap kali ...

Penukaran objek dan tatasusunan Java: Perbincangan mendalam tentang risiko dan kaedah penukaran jenis cast yang betul Banyak pemula Java akan menemui penukaran objek ke dalam array ...

Bagaimanakah penyelesaian caching Redis menyedari keperluan senarai kedudukan produk? Semasa proses pembangunan, kita sering perlu menangani keperluan kedudukan, seperti memaparkan ...

Penjelasan terperinci mengenai reka bentuk jadual SKU dan SPU di platform e-dagang Artikel ini akan membincangkan isu reka bentuk pangkalan data SKU dan SPU dalam platform e-dagang, terutamanya bagaimana menangani jualan yang ditentukan pengguna ...
