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!