我使用Jetty,并且想记录请求的参数和正文。

将AccessLogger添加到处理程序:

    ServletContextHandler servletContextHandler = new ServletContextHandler();
    ...

    RequestLogHandler requestLogHandler = new RequestLogHandler();
    requestLogHandler.setRequestLog(new AccessLogger());

    HandlerCollection handlers = new HandlerCollection();
    handlers.setHandlers(new Handler[]{
            servletContextHandler,
            requestLogHandler
    });


AccessLogger实现RequstLog接口:

@Override
public void log(Request request, Response response) {
    request.getReader();
}


问题是,当我尝试运行request.getReader()时,它说IllegalStateException: STREAMED。我认为那是因为先前的处理程序已经读取了所有数据。但是,如何才能按照我需要的方式进行记录?

最佳答案

标准Servlet行为。

如果您的Servlet(通过getInputStream()getReader())读取了请求正文,那么您已经读取了它,则无法再次读取它。

getReader()getInputStream()所使用的技术是显示身体内容的方式,无法更改。


如果使用getReader(),则以后不能使用getInputStream()
如果使用getInputStream(),则以后不能使用getReader()


有关更多详细信息,请参见getReader()getInputStream()的Javadoc。

10-07 12:17