問題:
在Java Servlet 過濾器中,嘗試存取多個從POST 請求正文檢索的HTTP 請求參數會導致第二個參數無法使用。發生這種情況是因為消耗參數會消耗整個請求的參數。
問題:
有沒有辦法在不消耗它們的情況下讀取請求參數?
答案:
替代解決方案:
使用切面建立自訂攔截器元件可以是一種替代解決方案方案,無需涉及過濾器鏈即可實現多次讀取,並提高效率。
擴充 HttpServletRequestWrapper 解決方案:
要保留過濾器鏈中多次讀取的請求正文參數,請擴充HttpServletRequestWrapper類別並使用輸入流快取:
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 { cachedBytes = new ByteArrayOutputStream(); IOUtils.copy(super.getInputStream(), cachedBytes); } // CachedServletInputStream implementation omitted for brevity }
過濾器用法:
在透過過濾器鏈傳遞原始請求之前將其包裝在擴充類別中:
public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request); // Perform multiple reads here chain.doFilter(multiReadRequest, response); } }
這種方法可以透過getInputStream()、getReader()和參數檢索進行多次讀取
更新較新的ServletInputStream:
在快取流實作中實作附加方法isReady()、setReadListener() 和isFinished( ) 以遵循更新的ServletInputStream 介面。
以上是如何多次讀取HTTP POST請求參數而不消耗它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!