Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么人们使用BufferedReader读取post数据_Java_Http_Servlets - Fatal编程技术网

Java 为什么人们使用BufferedReader读取post数据

Java 为什么人们使用BufferedReader读取post数据,java,http,servlets,Java,Http,Servlets,人们有时使用BufferedReader读取post数据 BufferedReader bReader; String postData = null; try { bReader = request.getReader(); char[] buf = new char[1024]; int len; StringBuilder sBuilder = new StringBuilder();

人们有时使用BufferedReader读取post数据

    BufferedReader bReader;
    String postData = null;
    try {
        bReader = request.getReader();
        char[] buf = new char[1024];
        int len;
        StringBuilder sBuilder = new StringBuilder();
        while ((len = bReader.read(buf)) != -1) {
            sBuilder.append(buf, 0, len);
        }
        postData = sBuilder.toString();
    } catch (IOException e) {
        bReader = null;
    }

我应该在什么时候使用它来获取参数,request.getParameter()如何?

有时POST数据不是名称-值对。例如,有时它是一个XML文档。

我对BufferedReader不太了解,但是,您可以尝试创建一个字符串数组列表,每次发送帖子时,将消息推入数组并对索引大小进行限制,否则,根据指定服务器的硬盘空间,最终会出现内存问题。

,当请求的POST数据由请求参数以外的内容组成时,使用这种方法

所以

我应该什么时候使用它来获取参数,request.getParameter()怎么样

当您希望request POST主体是一个文档时,可以使用它。但正如下文所述,这可能不够


该代码不是特别有效,并且在其他方面可能存在问题

在效率方面,代码使用
BufferedReader
并在传输到
StringBuilder
之前读取一个大(-ish)字符缓冲区

  • 使用
    BufferedReader
    char[]
    是毫无意义的。如果要执行块读取,最好(稍微)从底层
    读取器
    读取

  • 将整个POST数据读入
    StringBuilder
    (不限制其长度)可能会使您面临旨在触发OOME的拒绝服务攻击。(如果长请求是合法的,您将遇到相同的问题…)

还有更大的问题:

  • 是否应该将POST数据作为字符流处理,而不是尝试创建单个字符串

  • 将POST数据视为字符是否正确?(请参见内容类型标题。)

  • 您是否使用正确的编码方案来解码字符?(参见内容类型标题等)

  • 您应该使用Content-length头作为调整大小和/或强制执行请求大小限制的提示

简而言之,您向我们询问的代码看起来过于简单,无法作为读取POST数据问题的通用解决方案


如果post数据占用大量内存,它会被分为两部分或更多部分发送吗


可能不会。事实上,除非你(webapp的开发人员)实施一个允许客户端发送较小数据块的方案,否则客户端可能别无选择,只能在POST数据中发送一个大文档。当然,根据文档是什么以及需要如何处理,您可能不需要在内存中组装所有文档。另一点是,你不应该依靠客户“做正确的事情”,因为它会给你带来什么。您的服务器需要在某个时刻进行自我保护。

没错,这就是我想问的问题。如果post数据占用大量内存,它会被分为两部分或更多部分发送吗?如果您谈论的是ArrayList的负载量,您可以通过检查大小来限制ArrayList中字符串对象的总数,查看它是否是您确定的量,以及是否是删除第一个索引并每次继续添加。非常好,+1,但在某些情况下,BufferedReader会直接传输到目标缓冲区,因此“(稍微)更好”并不一定如此。@EJP-边际效率改进包括实例化不必要的
BufferedReader
的成本。因此,在所有情况下都是不同的。离题了,但祝贺你最近通过了200000次测试。:)我建议在阅读文本时处理文本,而不是将数据从一个缓冲区复制到另一个缓冲区并进行处理。它效率更高,代码更干净。