[ BUG 记录] Servlet 的 response 每次都被截取丢失最后 12 个字符

316 阅读1分钟

这是一个 CS 架构的程序,前端是一个用 C++ 编写的 Windows 客户端,后端是用传统的 Java Servlet 技术实现的服务,打包成 war 包,部署在 Tomcat 上。

客户端通过 Get 方法调用服务器的接口,服务器将数据写进响应流中返回(非 RESTful 格式)。

某天客户反映说客户端有的数据可以显示,有的数据无法显示,于是:

  • 远程登陆客户机,重复客户操作,复现问题
    • 问题确实能被复现
  • 查看服务器日志,未发现异常
  • 将无法显示数据的接口通过浏览器访问,打开 F12 监控面板,查看网络请求
    • 发现 HTTP response 的内容中,服务器返回的数据被 截取 了,客户端收到的数据不完整,无法解析,所以没有显示出数据
    • 通过对比服务器的日志,发现服务器没有报错,而且组装的返回数据是正确且完整的
    • 通过进一步查看 HTTP response 的 header,发现 Content-Length 字段的值和实际截取后的返回数据长度不一致,字段值比数据长度多了 12。
  • 比较可以显示的数据和无法显示的数据,发现无法显示的数据都带有中文,且 Content-Length 的值和实际返回数据的长度是相等的
    • 判断是字符编码的问题,由于有了之前的 调试经验, 让客户排查了一下服务器上的环境变量 locale,果然从原来的 UTF-8 变成了 GBK

恢复了正确的 locale 之后,问题解决。