HttpRequestMethodNotSupportedException

异常

org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘HEAD’ not supported

异常原因

项目使用的是SprngMVC,查看服务器日志,发现访问首页报了以上的异常。异常的意思是:请求方法“HEAD”不支持,为何不支持呢?查看项目源码,发现配置了:@RequestMapping(value = “”,method = RequestMethod.GET)。此方法只支持GET请求,不支持HEAD请求。

解决方法

去掉method = RequestMethod.GET即可

为何会有HEAD请求

我们在浏览器输入地址,都是GET请求,查看服务器日志,发现有许多HEAD请求,一时找不到为何有那么多HEAD请求。突然想起,项目是用的Tengine做的负载均衡,会不会是Tengine做的请求,通过查看资料,终于明白了,因为开启了Tengine的主动式后端服务器健康检查功能,Tengine会不定时发送HEAD请求,向后端发送的健康检查包。

参考文章1
参考文章2

Http 1.1 规范定义了一些方法:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE and CONNECT.
常见的是:GET 和 POST。浏览器依靠这两个方法从web服务器发送和获取数据。

  • GET
    从web服务器获取数据。
  • POST
    操作web服务器内容,比如:增删改。

其他的方法呢?
浏览器不是唯一与web服务器通信的客户端,还有:代理服务器(proxy servers)和爬虫(web crawlers),这两种类型的客户端特别喜欢第三个http方法:HEAD。

HEAD和GET相似,不过HEAD方法只返回headers,body被丢弃。
这个主要用来校验URLs的正确性。(下面的不知如何翻译)服务器的负载 content-length头必须返回。The load on the server will most likely remain the same as the content-length header must be returned (and thus potentially calculated based on the generated response body). Only the bandwidth is saved。


版权声明:本文为nextyu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。