为什么人们使用BufferedReader来读取帖子数据

时间:2013-08-22 02:04:27

标签: java http servlets

人们有时会使用BufferedReader来阅读帖子数据。

    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()?

3 个答案:

答案 0 :(得分:4)

正如EJP所说,当请求的POST数据包含除请求参数之外的其他内容时,将使用此方法。

所以......

  

我什么时候应该用它来获取参数,请问request.getParameter()?

当您期望请求POST正文作为文档时,您可以使用它。但这可能还不够,如下所述。


该代码效率不高, 在其他方面可能会出现问题。

在效率方面,代码在转移到BufferedReader之前使用StringBuilder AND 读取大型(-ish)字符缓冲区。

  • 使用BufferedReaderchar[]有点毫无意义。如果您要进行块读取,那么从基础Reader读取(稍微)会更好。

  • 将整个POST数据读入StringBuilder(不限制其长度)可能会让您对旨在触发OOME的拒绝服务攻击持开放态度。 (如果长请求是合法的,你将得到同样的问题......)。

还有更大的问题:

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

  • 将POST数据视为字符是否正确? (请参阅Content-type标题。)

  • 您使用正确的编码方案来解码字符吗? (参见Content-type标题,等等)

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

简而言之,您询问我们的代码看起来过于简单,无法解决读取POST数据的问题。


  

如果发布数据需要大量内存,是否会将其分成两部分或更多部分?

可能不是。实际上,除非您(webapp的开发人员)实现允许客户端以较小的块发送的方案,否则客户端可能别无选择,只能在POST数据中发送一个大文档。当然,根据文档的内容以及需要如何处理文档,您可能不需要组装到内存中。另一点是,你不应该依赖客户“做正确的事”来发送你的东西。您的服务器需要在某些时候为自己辩护

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我对BufferedReader知之甚少,但您可以尝试创建一个字符串的ArrayList,每次发送一个帖子都会将消息推送到数组中并限制索引大小,否则最终会出现内存问题取决于指定服务器的硬盘空间。