後端:
參考:- 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 的方式獲取也比較推薦。
前端: