Java HttpServletRequestWrapper未按预期工作

Java HttpServletRequestWrapper未按预期工作,java,servlets,httpwebrequest,servlet-filters,Java,Servlets,Httpwebrequest,Servlet Filters,我需要记录请求正文内容。为此,我使用了filter和HttpServletRequestWrapper,如下所示。但是当我从servlet调用request.getParameter时,我什么都没有得到。谢谢你的帮助 请求包装器代码 public class MultiReadHttpServletRequest extends HttpServletRequestWrapper { private static final Log log = LogFactory.getLog(MultiR

我需要记录请求正文内容。为此,我使用了filter和HttpServletRequestWrapper,如下所示。但是当我从servlet调用
request.getParameter
时,我什么都没有得到。谢谢你的帮助

请求包装器代码

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

private static final Log log = LogFactory.getLog(MultiReadHttpServletRequest.class);

private ByteArrayOutputStream cachedBytes;

public MultiReadHttpServletRequest(HttpServletRequest request) throws IOException {
    super(request);
    cachedBytes = new ByteArrayOutputStream();

    byte[] buffer = new byte[1024 * 4];
    int n;
    while (-1 != (n = request.getInputStream().read(buffer))) {
        cachedBytes.write(buffer, 0, n);
    }
}

@Override
public ServletInputStream getInputStream() throws IOException {
    return new CachedServletInputStream();
}

private class CachedServletInputStream extends ServletInputStream {
    private ByteArrayInputStream input;

    public CachedServletInputStream() {
        input = new ByteArrayInputStream(cachedBytes.toByteArray());
    }

    @Override
    public int read() throws IOException {
        return input.read();
    }
}

String getRequestBody() throws IOException {
    StringBuilder inputBuffer = new StringBuilder();
    String line;

    BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream()));
    try {
        do {
            line = reader.readLine();
            if (null != line) {
                inputBuffer.append(line.trim());
            }
        } while (line != null);
    } catch (IOException ex) {
        log.error("Unable to get request body from request: " + ex.getMessage(), ex);
    } finally {
        try {
            reader.close();
        } catch (IOException e) {
            // Just log error
            log.warn("Unable to close BufferReader: " + e.getMessage(), e);
        }
    }

    return inputBuffer.toString().trim();
}
我的过滤代码

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                     FilterChain filterChain) throws IOException, ServletException {

    if ((servletRequest instanceof HttpServletRequest) && (messageTracerApiClient != null)) {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        MultiReadHttpServletRequest bufferedRequest = new MultiReadHttpServletRequest(httpServletRequest);

        Message message = new Message();
        message.setHost(bufferedRequest.getLocalAddr());
        message.setPayload(bufferedRequest.getRequestBody());
        messageTracerApiClient.publishMessage(message);

        System.out.println("bufferedRequest param= " + bufferedRequest.getParameterMap().size());

        filterChain.doFilter(bufferedRequest, servletResponse);
    } else {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

请注意
bufferedRequest.getParameterMap().size()
即使有参数,也会打印0。

您在代码中调用
request.getParameter
的位置?我在servlet中使用了该参数,结果为空。另外,bufferedRequest.getParameterMap().size()为零。但我总是可以得到bufferedRequest.getRequestBody()。