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!