首頁 >Java >java教程 >如何多次讀取HTTP POST請求參數而不消耗它們?

如何多次讀取HTTP POST請求參數而不消耗它們?

DDD
DDD原創
2024-12-07 06:18:11213瀏覽

How Can I Read HTTP POST Request Parameters Multiple Times Without Consuming Them?

Http Servlet 請求參數在Post Body 中消失

問題:

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn