我在 Jetty 处理 application/json
格式的请求正文数据时遇到问题。本质上,当 Jetty 处理请求体时,请求数据就被切断了。
我有一个相对较大的 POST 正文,大约 74,000 字节。根据我在网上找到的一些建议,我实例化了一个新的上下文处理程序,并将 setMaxFormContentSize
属性设置为足够大的 500,000 字节。
ServletContextHandler handler = new ServletContextHandler(server, "/");
handler.setMaxFormContentSize(500000);
但是,这似乎无法正常工作。我还在网上读到,此属性可能仅适用于表单编码数据,不适用于 application/json
,这是我们应用程序的严格要求。
有什么办法可以避免这个问题吗?是否有一些特殊的约束类,我可以对其进行子类化,以允许处理大小增加到至少 500KB?
编辑#1:我应该补充一点,我还尝试将限制的大小降低到 5 个字节,看看它是否会切断有效负载中的更多数据。这也不起作用,这似乎意味着这肯定完全忽略了该属性。
编辑#2:这是我从请求流中读取信息的地方。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String json = CharStreams.toString(new InputStreamReader(req.getInputStream()));
....
} catch (Exception e) {
logger.error("Exception in internal api forwarder", e);
throw e;
}
}
这似乎是从请求流读取的标准方法。我还尝试使用 req.getReader()
中的 BufferedReader
来解决同样的问题。
维韦克
最佳答案
这个 CharStreams
对象是什么?
它似乎不知道、不关心、也不尊重请求的字符编码。 (坏主意)
建议您使用servlet request.getReader()
而不是 request.getInputStream()
(实际上只为二进制请求正文内容设计)
使用 request.getReader()
至少可以正确支持您的请求字符编码。
您可能想要查看的另一条信息是 request.getContentLength()
并验证请求 header 确实包含您期望的大小。
关于java - 无法读取格式为 application/json 的整个 POST 请求正文内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620581/