


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

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)