net::ERR_INCOMPLETE_CHUNKED_ENCODING SPRING MVC应用程序使用JSP

11
我使用 SPRING MVC 和 JSP 开发了一个 Web 应用程序,本地运行良好,但是当我在服务器上部署时,遇到了以下错误,并且无法加载任何内容。 除登录页面外,所有页面都会出现这种情况。我监控了 Tomcat 日志,但没有异常信息。 我已经搜索了整整一天,仍然无法找到根本原因,请建议如果您知道的话。 附图:chorome network info, show status faul

遇到相同的错误。有解决方案吗? - ersnh
是的,我无法控制分块发送请求。但是我通过增加响应缓冲区大小来解决了这个问题。因此,问题是响应大于缓冲区大小。这样做解决了我的问题。 - mahesh
4个回答

11

远程的Tomcat可能具有较小的默认写入缓冲区大小、部分配置的直接缓冲区,或者更可能是服务器在请求中返回更多数据。

无论如何,要查看这些值,暂时将以下标签粘贴到登录页面的body底部以及一个破损的页面。

<% out.println("<p>bufferSize: " + out.getBufferSize() + " remaining: " + out.getRemaining() + " used: " + (out.getBufferSize() - out.getRemaining()) + " autoFlush: " + out.isAutoFlush() + "</p><br>"); %>
你应该看到类似于:
bufferSize: 8192 remaining: 1509 used: 6683 autoFlush: true

如果您希望快速解决问题,可以考虑在JSP页面顶部添加以下标记,尝试以无缓冲方式渲染非工作页面:

<%@ page buffer="none" %>

如果仍然无法解决问题,请尝试选择一个更大的数字,比如8MB(而不是8KB),并通过添加以下代码来查看页面是否能够渲染:

<%@ page buffer="8192kb" %>
如果这解决了问题,那么只需在页面上记录使用的缓冲区大小,稍微增加一点并进行调整,例如:
bufferSize: 8380416 remaining: 8321883 used:58533 autoFlush: true

你可能可以这样做:

<%@ page buffer="64kb" %>

如果仍然没有运气,我怀疑您的JSP中有一个破损的循环。

注意:不要将页面缓冲区留在愚蠢的数字上,因为有一个单一的池,在所有连接之间共享。


我遇到了这个问题,实际的根本原因是其他的,但是在我的JSP中添加<%@ page buffer="64kb" %>后显示了实际的错误。 修复了实际的错误后,我删除了缓冲区并且它正常工作了。谢谢 :) - Gaurav Pingale
我遇到了类似的问题,你能帮我吗? - Shubham Arya
我正在使用display:table标签,当我从记录较少的表(约500条)查询时,它可以正常工作。但是当我处理记录更多的表(约40K)时,就会出现问题。 - Shubham Arya

1
我在处理代理上下文中的POST请求时遇到了ERR_INCOMPLETE_CHUNKED_ENCODING问题:请求是从Chrome浏览器发起的,到达我的SpringMVC-Apache/Tomcat7 webapp,然后转发到一个SpringMVC-Apache/Tomcat8 REST应用程序。
结果发现根本原因是:从代理返回响应到浏览器时,没有重置从REST应用程序获取的HTTP响应头。所以可能Chrome不喜欢这些头中的某些内容。
解决方法是从我的代理实例化新的响应头,同时重用从REST应用程序接收到的主体。
        ResponseEntity<InfoBean> resE = restTemplate.exchange(reqE, InfoBean.class);
        ResponseEntity<InfoBean> resEE = new ResponseEntity<>(resE.getBody(), HttpStatus.OK);
        return resEE;

0
在我的情况下,这个问题是由于代理也响应头Transfer-Encoding引起的,而我的服务器将所有头信息转发到客户端。删除Transfer-Encoding对我来说解决了这个问题。 这里也有相关的地址:rfc9112#name-transfer-encoding
HttpHeaders headers = new HttpHeaders();
proxyResonse.getHeaders().forEach((key, value) -> {
    if (!key.equals(HttpHeaders.TRANSFER_ENCODING)) {
       headers.addAll(key, value);
    }
});
// add `headers` to client response

-1

我通过将arober11建议的内容添加autoflush属性来解决了类似的问题。

<%@page buffer="8192kb" autoFlush="true" %>

你能详细解释一下这个问题吗? - Shubham Arya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接