人们有时会使用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()?
答案 0 :(得分:4)
正如EJP所说,当请求的POST数据包含除请求参数之外的其他内容时,将使用此方法。
所以......
我什么时候应该用它来获取参数,请问request.getParameter()?
当您期望请求POST正文作为文档时,您可以使用它。但这可能还不够,如下所述。
该代码效率不高, 在其他方面可能会出现问题。
在效率方面,代码在转移到BufferedReader
之前使用StringBuilder
AND 读取大型(-ish)字符缓冲区。
使用BufferedReader
和char[]
有点毫无意义。如果您要进行块读取,那么从基础Reader
读取(稍微)会更好。
将整个POST数据读入StringBuilder
(不限制其长度)可能会让您对旨在触发OOME的拒绝服务攻击持开放态度。 (如果长请求是合法的,你将得到同样的问题......)。
还有更大的问题:
应该将POST数据作为字符流处理而不是尝试创建单个字符串吗?
将POST数据视为字符是否正确? (请参阅Content-type标题。)
您使用正确的编码方案来解码字符吗? (参见Content-type标题,等等)
您是否应该使用Content-length标头作为调整大小和/或强制执行请求大小限制的提示。
简而言之,您询问我们的代码看起来过于简单,无法解决读取POST数据的问题。
如果发布数据需要大量内存,是否会将其分成两部分或更多部分?
可能不是。实际上,除非您(webapp的开发人员)实现允许客户端以较小的块发送的方案,否则客户端可能别无选择,只能在POST数据中发送一个大文档。当然,根据文档的内容以及需要如何处理文档,您可能不需要将组装到内存中。另一点是,你不应该依赖客户“做正确的事”来发送你的东西。您的服务器需要在某些时候为自己辩护。
答案 1 :(得分:0)
有时POST数据不是名称 - 值对。有时例如它是一个XML文档。
答案 2 :(得分:0)
我对BufferedReader知之甚少,但您可以尝试创建一个字符串的ArrayList,每次发送一个帖子都会将消息推送到数组中并限制索引大小,否则最终会出现内存问题取决于指定服务器的硬盘空间。