Http 請求 header 大小寫有區別嗎?

懒惰的星期六發表於2024-08-22

後端:

參考:- java - APP 莫名崩潰,開始以為是 Header 中 name 大小寫的鍋,最後發現原來是容器的錯! - 小航的技術筆記 - SegmentFault 思否

Q: 這麼多獲取 Header 的方式有什麼區別?
A:

不同的容器下實現方式不同,這裡列表說明

undertow tomcat jetty
請求引數大小寫轉換 不變 小寫 駝峰
直接獲取請求頭某一個 headerName 忽略大小寫,不能為空 忽略大小寫,不能為空 忽略大小寫,不能為空
使用 Map 獲取所有請求頭 Map 的 key 和傳入 headerName 大小寫的一致,保持一致可獲取到 Map 的 key 全是小寫,需要使用小寫headerName 獲取 Map 的 key 是駝峰命名法,要使用駝峰命名才可以獲取到
使用 MultiValueMap 獲取請求頭 實際是從 LinkedHashMap 中獲取,區分大小寫 實際是從 LinkedHashMap 中獲取,區分大小寫 從 LinkedCaseInsensitiveMap 獲取,不區分大小寫
使用 HttpHeaders 獲取請求頭 從 LinkedCaseInsensitiveMap 獲取,不區分大小寫 從 LinkedCaseInsensitiveMap 獲取,不區分大小寫 從 LinkedCaseInsensitiveMap 獲取,不區分大小寫
使用 HttpServletRequest 獲取 使用 HttpString.hashCodeOf(headerName) 忽略了大小寫 呼叫 MimeHeaders#getValue 忽略了大小寫 HttpFields#get 忽略了大小寫

透過表格發現,即使是不同的容器在使用 HttpHeaders 獲取請求頭是都是呼叫了 Spring 的 LinkedCaseInsensitiveMap 獲取 header,並且內部忽略了大小寫,這裡比較推薦使用。
同樣使用 HttpServletRequest 的方式獲取也比較推薦。

前端:

相關文章