HTTP 1.1声明: “客户端必须在所有HTTP / 1.1请求消息中包含主机头字段”
然而,我正在处理的机器会发出这个确切的POST(包含坐标),我无权更改:
POST /touch HTTP/1.1
Content-type: application/x-www-form-urlencoded
Content-Length: <n>
x=<int x>&y=<int y>
由于缺少Host头字段,Tomcat 7立即响应400 Bad Request
,POST永远不会到达我的servlet。有什么方法可以避免这个错误响应并使用servlet处理POST以支持这些旧机器吗?
答案 0 :(得分:5)
正如您已经注意到的那样,HTTP 1.1 spec says(我的大胆):
客户端必须在所有HTTP / 1.1请求消息中包含Host header 字段。 [...] HTTP / 1.1代理必须确保它转发的任何请求消息都包含一个适当的主机头字段,用于标识代理请求的服务。所有基于Internet的HTTP / 1.1服务器必须以400 (错误请求)状态代码响应任何缺少主机头字段的HTTP / 1.1请求消息。
客户端错误地使用HTTP 1.1协议,您不应该尝试在服务器端解决此问题。您可以做的是设置一些自定义HTTP代理,只需添加Host
标头。但这是一个肮脏的解决方法。或者将协议降级为1.0。
另请注意,即使您以某种方式设法让Tomcat接受此类请求(这违反了规范),如果任何HTTP代理在两端之间,您仍会遇到一些问题。