Java 读取Jetty请求正文会导致IndexOutOfBoundsException

Java 读取Jetty请求正文会导致IndexOutOfBoundsException,java,jetty,tomcat7,embedded-jetty,Java,Jetty,Tomcat7,Embedded Jetty,我们最近开始在开发中使用Jetty 9.1.0运行我们的应用程序。在生产中使用Tomcat 7运行相同的应用程序。无论何时发生POST请求,我们都使用以下方法读取请求正文: private static String readRequestData(HttpServletRequest request) throws IOException { BufferedReader r = request.getReader(); if (request.getContentLength

我们最近开始在开发中使用Jetty 9.1.0运行我们的应用程序。在生产中使用Tomcat 7运行相同的应用程序。无论何时发生POST请求,我们都使用以下方法读取请求正文:

private static String readRequestData(HttpServletRequest request) throws IOException
{
    BufferedReader r = request.getReader();
    if (request.getContentLength() > 0)
    {
        int len = request.getContentLength();

        char[] buf = new char[len];
        int read = 0;
        int readTo = 0;
        while (read > -1)
        {
            read = r.read(buf, readTo, 1000);
            readTo += read;
        }
        return new String(buf);
    }
    return "";
}
在Tomcat下,BufferedReader对象是org.apache.catalina.connector.CoyoteReader,并且正确读取数据。在Jetty下,读取器是org.eclipse.Jetty.server.Request,这将导致java.lang.IndexOutOfBoundsException第二次通过循环。第二次调用read就会抛出异常。我甚至无法通过循环第二次阅读,这让人困惑

谁能为我们做错了什么提供指导

谢谢大家!

char[] buf = new char[len];
        int read = 0;
        int readTo = 0;
        while (read > -1)
        {
            read = r.read(buf, readTo, 1000);
            readTo += read;
        }
在上面的代码中,您正在从“
request.getReader
”读取内容,方法
read
1000个字符到指定的数组
buf
,从
readTo
开始。随着循环的增加,字符大小的最小要求随着
1000+readTo+..

1st Iteration -> char elements are added from index 0 - 1000
2nd Iteration -> char elements are added from index 1000 - 2000

因此,如果在第二次迭代中出现问题,可以检查数组的大小必须大于2000

字符数组是目标。请记住,此代码在Tomcat下工作,因此区别在于BufferedReader实现,int,int)你的建议起了作用。奇怪的是,郊狼首领知道在buf结束时停止,而Jetty的实现却不知道。