【问题标题】:HTTP: what is the correct way to send "retry/redirect" responseHTTP:发送“重试/重定向”响应的正确方法是什么
【发布时间】:2017-10-21 23:25:30
【问题描述】:

我需要强制客户端重试其请求(意味着再发送一次相同的请求)。我在想的是带有状态码307 和标题Location: <original-url> 的响应(现在已经足够好了,除非有更好的方法)。

我的问题是,从 HTTP 规范的角度来看,Location 在此特定上下文中的正确值是多少。或者更具体地说,在具有HttpServletRequest 类型的request 的Java 中,我应该使用哪个:getRequestURI(返回此请求的 URL 的一部分,从协议名称到 HTTP 请求第一行中的查询字符串)或getRequestURL(重构客户端用于发出请求的 URL,包含协议、服务器名称、端口号和服务器路径,但不包括查询字符串参数)。

感谢任何其他建议/评论。

【问题讨论】:

  • 这肯定需要更多信息:你想强制客户端刷新内容吗?还是在排队处理?
  • 一点上下文:服务器无法处理请求,因为它正在关闭。但是,如果客户端关闭连接并打开一个新连接并发送相同的请求(相同的方法、标头、正文、所有内容),他将连接到另一个正在运行的服务器。请参阅我对朱利安回答的评论。

标签: java http web http-headers


【解决方案1】:

getRequestURL() 返回客户端使用的完整 URL,而 getRequestURI() 仅返回驻留在服务器中的基本路径。 我正在使用这种技术以响应状态重定向这是我的代码,这很有用:-

httpServletResponse.reset();
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
httpServletResponse.setHeader("SERVER-RESPONSE", "bad request");
return;

你也可以设置响应头。

【讨论】:

  • 仅供参考,但我的问题是关于标题的。
  • 不要使用发送重定向或请求调度程序来重定向请求我用标头设置块更新了我的代码..
  • IMO 绝对不是 Bad RequestUnauthorized 在这里是一个有效的选项。根据定义,它们是客户的错,在这种情况下并非如此。客户端在收到Bad RequestUnauthorized 后不应重试相同的请求。
【解决方案2】:

我认为重定向首先是错误的状态代码。

这不就是 503 的用途吗? (https://www.greenbytes.de/tech/webdav/rfc7231.html#status.503)

【讨论】:

  • 嗯,AFAIK 没有专门为这种情况定义的状态代码。我在网上找到了不同的建议(针对略有不同的场景):503、307、302、423、409 或 202。
  • 我选择 307 的原因是因为大多数客户端会自动进行重定向。但是(正如您已经知道的)问题在于,对于 GET 和 HEAD 以外的方法,它们没有(根据 HTTP 规范)。不过,如果我们设置 Retry-After 标头,我看到了 503 的潜力。问题是 5XX 响应是我们最不希望在日志中包含的内容。
猜你喜欢
  • 2010-10-23
  • 2010-10-04
  • 2011-09-27
  • 2019-10-09
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多