读取Jetty请求正文导致IndexOutOfBoundsException

时间:2014-02-13 18:19:10

标签: 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() > 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会抛出异常。我甚至无法通过循环第二次进入阅读,这令人困惑。

任何人都能提供有关我们做错事的指导吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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