首页 > Java > java教程 > 如何无消耗地多次访问HTTP Servlet请求参数?

如何无消耗地多次访问HTTP Servlet请求参数?

DDD
发布: 2024-11-30 10:15:19
原创
480 人浏览过

How to Access HTTP Servlet Request Parameters Multiple Times Without Consumption?

无消耗访问HTTP Servlet请求参数

问题:

访问多个HTTP请求时Servlet 过滤器中的参数,初始参数访问会消耗这些参数,使其无法用于后续使用。这个问题在参数驻留在请求正文中的 POST 请求中尤其容易出现。

解决方案:

要访问参数而不消耗它们,您可以扩展 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);
  }

  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();
    }
    // ... Implementation for newer versions of ServletInputStream interface
  }
}
登录后复制

通过使用此类包装原始请求,您可以访问在过滤器链内外多次缓存输入流,允许 getParameterXXX 和 doMyThing 等自定义方法读取参数:

public class MyFilter implements Filter {
  public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);
    doMyThing(multiReadRequest.getInputStream());
    chain.doFilter(multiReadRequest, response);
  }
}
登录后复制

以上是如何无消耗地多次访问HTTP Servlet请求参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板