-1

人们有时使用 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()怎么样?

4

3 回答 3

4

正如 EJP 所指出的,当请求的 POST 数据包含请求参数以外的内容时,使用此方法。

所以 ...

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

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


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

在效率方面,代码BufferedReader 传输到StringBuilder.

  • 使用 aBufferedReader和 achar[]是没有意义的。如果您要进行块读取,则(稍微)从底层读取更好Reader

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

还有更大的问题:

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

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

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

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

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


如果 post 数据占用大量内存,是否会分成两部分或更多部分发送?

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

于 2013-08-22T02:42:18.417 回答
0

我对 BufferedReader 了解不多,但是您可以尝试创建一个字符串的 ArrayList,并且每次发送帖子时将消息推送到数组中并限制索引大小,否则您最终会遇到内存问题,具体取决于指定服务器的硬盘空间。

于 2013-08-22T02:16:31.593 回答
0

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

于 2013-08-22T02:06:52.433 回答