java - 读取 Jetty 请求正文会导致 IndexOutOfBoundsException

标签 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 就会引发异常。我什至无法进入第二次循环读取,这很令人困惑。

任何人都可以就我们做错的事情提供指导吗?

谢谢!

最佳答案

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

关于java - 读取 Jetty 请求正文会导致 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762362/

相关文章:

java - 为什么 STS 会警告我参数不匹配?

java - 从 CSV 文件 Java 清除回车符

java - 嵌入式 Jetty 和复杂的日志记录

postgresql - PostgreSQL 9.6分区表和gram 2.5.6 tomcat7或tomcat8下的怪异操作

java - Android java.util.Calendar - 时差

c# - 相当于 C# 排序列表的 Java

java - 如何使用 jetty.sh 停止 jetty 7 中的生成进程?

java - Spring 启动 : hot swapping does not work

jakarta-ee - 在 Tomcat 7 中使用 Web 套接字

java - 如何避免请求集 ASYNC_SUPPORTED=true 以在 Tomcat 7 上启用异步 servlet 3.0 处理?