Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http Tomcat报告文件下载的500状态已成功启动_Http_Tomcat - Fatal编程技术网

Http Tomcat报告文件下载的500状态已成功启动

Http Tomcat报告文件下载的500状态已成功启动,http,tomcat,Http,Tomcat,关于为什么我们可能会从tomcat收到这500个状态的文件下载,而这些文件下载似乎是成功开始的(200个状态),有什么友好的建议吗 我们正在使用一个日志来记录对tomcat服务器的所有请求 模式如下: #字段:日期时间所用时间sc状态cs方法x-H(方案)cs(主机)cs uri系统cs uri查询sc(内容长度)字节c-ip x-R(访问\度量\用户名)x-R(访问\度量\开放ID)x-R(访问\度量\用户ID)x-R(访问\度量\会话ID)cs(引用)cs(用户代理) #版本:2.0 #软件

关于为什么我们可能会从tomcat收到这500个状态的文件下载,而这些文件下载似乎是成功开始的(200个状态),有什么友好的建议吗

我们正在使用一个日志来记录对tomcat服务器的所有请求

模式如下:

#字段:日期时间所用时间sc状态cs方法x-H(方案)cs(主机)cs uri系统cs uri查询sc(内容长度)字节c-ip x-R(访问\度量\用户名)x-R(访问\度量\开放ID)x-R(访问\度量\用户ID)x-R(访问\度量\会话ID)cs(引用)cs(用户代理)

#版本:2.0

#软件:ApacheTomcat/7.0.76

下面是一个文件下载的500状态响应示例,该文件下载启动后发送1219416字节(1.1兆)数据失败

2019-09-24 06:00:14 200.109 500获取https“www.www.{HOST_NAME}.org”/api/v1/archive/request/{UUID}/file/{UUID}api-token={api_-token}”7600353549“1219416 xxx.xx.xxx.181”{USER_-OPENID}“{USER_-UUID}”-“{REFERER}”Mozilla/5.0(Windows NT 6.1;Trident/7.0;rv:11.0)像Gecko一样

以下是我们所有领域的解释:

  • 日期
  • 时间
  • 所用时间,请求从开始到完成所用的时间量
  • sc状态,http状态代码
  • cs_方法,http请求方法
  • 使用的http协议x-H(scheme)始终是https
  • 政务司司长(主持人)、网站主持人
  • cs uri系统,请求的url
  • cs uri查询,查询参数
  • sc(内容长度),响应中预期的字节数
  • bytes,发送的字节数
  • c-ip,客户端ip地址
  • x-R(access\u metrics\u username),用户的用户名
  • x-R(access\u metrics\u openid),用户的openid
  • x-R(access\u metrics\u userid),用户的数据库uuid
  • x-R(access\u metrics\u sessionid),JSSessionID值
  • 政务司司长(参考)
  • 政务司司长(用户代理)
因此,用户成功地开始了持续200.109秒的下载,并成功下载了1.1兆的数据,然后发生了一些事情,该请求随后出错,tomcat将响应报告为500

我们还没有弄清楚这个请求发生了什么,或者如何复制它

我们尝试了以下方法:

  • 开始下载,然后从浏览器中取消下载。访问日志报告该请求的状态代码为200
  • 开始下载并将文件从tomcat下载的位置移动到磁盘上
如果您对正在发生的事情或如何重现此问题有任何想法或建议,我们将不胜感激

根据评论问题更新 问:您的日志中有任何异常吗

答:没有。但答案比这更复杂

我们通过包含白名单的ExcpetionFilter捕获大多数异常。这意味着以下异常不会被记录/邮寄给开发团队:

  • org.apache.catalina.connector.ClientAbortException
  • java.net.SocketException
  • xxx.xxx.service.security.xxx成功拒绝例外
  • org.apache.commons.fileupload.FileUploadBase$IOFileUploadException
我们这样做是为了不让自己被异常电子邮件和电子邮件淹没

我在白名单过滤器中添加了日志记录,以查看是否抛出了这些异常

编辑 我忘了在邮件的第一部分提到,我们实际上是自己流式传输文件,而不是让tomcat为我们做这项工作。很难解释为什么我们要这么做,但我们确实做到了

为了流式传输文件,我们使用Spring中的实用程序类

这个调用被一个try/catch包围,该try/catch只是转过来并用RuntimeException重新调用已检查的异常

try {

    FileCopyUtils.copy(new FileInputStream(file), response.getOutputStream());

} catch (FileNotFoundException | IOException e) {

    throw new RuntimeException(e);
}

在调用链中没有其他try/catch语句。

您多久会看到这些情况?这是个好问题。在过去的两个月里,我们已经收到了数十万(可能总共一百万)的申请。主要来自中国的ip地址。在其他日志文件中是否有诸如“客户端中止”之类的日志消息?同样,好问题。简短回答:不。再回答:嗯,也许吧。我将用更多关于我们如何处理异常和类似情况的信息更新这个问题。如果在执行
copy()
之后,在响应的
OutputStream
上添加显式的
close()
,情况会有所改善吗?您可能需要认真研究如何让Tomcat使用
sendfile
为您流式传输文件。它将提高性能并减少您需要照看的代码量。