【问题标题】:Abort HTTP PUT request when server sends an error with HttpClient-4当服务器使用 HttpClient-4 发送错误时中止 HTTP PUT 请求
【发布时间】:2012-08-24 08:45:20
【问题描述】:

我正在使用 httpclient-4 使用以下代码将流的内容(在本例中为大文件)发送到我的 Tomcat 的上传 servlet:

HttpRequest httpRequest = new HttpPut(destination);
InputStreamEntity entity = new InputStreamEntity(inputStream, contentLength);
((HttpPut)httpRequest).setEntity(entity);
httpClient.execute(httpRequest,handler);

效果很好。我后来添加了一个身份验证机制,以防止未经授权的用户上传文件。如果有人尝试在未经身份验证的情况下上传,则 servlet 会直接以

response.sendError(HttpServletResponse.SC_FORBIDDEN)

甚至不处理请求的 InputStream。

我面临的问题是,尽管请求在服务器端被拒绝,但我的客户端继续发送 InputStream 的全部内容,导致网络使用完全无用。

我查看了 httpclient 的文档,但遗憾的是没有找到任何关于这一点的信息。我还查看了tomcat方面是否可以中止请求,但it doesn't seem possible

这种情况有没有办法取消流的上传?

我们将不胜感激。

谢谢

【问题讨论】:

  • Here 是使用 apache common-file-update 的示例。
  • @Santosh 感谢您的链接,但我不能使用它,因为我不使用文件,而是直接使用流。事实上,如果用户被授权这样做,流的内容会被分割成块并直接重定向到 Voldemort 后端进行存储。

标签: java tomcat apache-httpclient-4.x


【解决方案1】:

此问题的适当解决方案是在客户端打开所谓的“期望:继续”握手。 Apache HttpClient 4.x 的较新版本默认禁用它。

【讨论】:

  • 这正是我想要的。我仍然有一些 Tomcat 问题要让它正确处理它,但修复它应该不是什么大问题。感谢您在此处和邮件列表中的帮助!
【解决方案2】:

您可以在服务器端关闭 InputStream,它会停止传输。

【讨论】:

  • 不幸的是它不起作用。我在服务器端添加了request.getInputStream().close();,文件的全部内容仍然发送。调用在 12:00:32,813 开始,服务器在 12:00:32:936 发送错误并关闭流,但响应处理程序仅在 12:00:44:883 执行。网络使用情况显示文件仍在发送中。我曾尝试在设置错误响应标头之后/之前关闭流,但始终相同。
猜你喜欢
  • 1970-01-01
  • 2022-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2017-10-24
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多