我使用 SPRING MVC 和 JSP 开发了一个 Web 应用程序,本地运行良好,但是当我在服务器上部署时,遇到了以下错误,并且无法加载任何内容。
除登录页面外,所有页面都会出现这种情况。我监控了 Tomcat 日志,但没有异常信息。
我已经搜索了整整一天,仍然无法找到根本原因,请建议如果您知道的话。
附图:![chorome network info, show status faul](https://istack.dev59.com/iVuv6.webp)
![chorome network info, show status faul](https://istack.dev59.com/iVuv6.webp)
远程的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中有一个破损的循环。
注意:不要将页面缓冲区留在愚蠢的数字上,因为有一个单一的池,在所有连接之间共享。
<%@ page buffer="64kb" %>
后显示了实际的错误。
修复了实际的错误后,我删除了缓冲区并且它正常工作了。谢谢 :) - Gaurav Pingale ResponseEntity<InfoBean> resE = restTemplate.exchange(reqE, InfoBean.class);
ResponseEntity<InfoBean> resEE = new ResponseEntity<>(resE.getBody(), HttpStatus.OK);
return resEE;
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
我通过将arober11建议的内容添加autoflush属性来解决了类似的问题。
<%@page buffer="8192kb" autoFlush="true" %>