異常
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請求,向後端發送的健康檢查包。
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。