user{
private int id
private String addTime
private String email
private String password
private String phone
}
接口方使用 @requestbody 接收參數將對象序列化為字符串進行加密 使用 使用: JSON.toJSONString(User ) 加密規則為 參數+固定的key進行 base64(md5(str))
結果為: {"addTime":1610978173026,"email":"112312312","id":1,"password":"125454","phone":"12121212"}
調用接口方沒有創建實體類,而是使用map手動創建的 如下:
Map<String,String> map = new LinkedHashMap<>();
map.put("addTime","1610977949556");
map.put("email","112312312");
map.put("id","1");
map.put("password","125454");
map.put("phone","12121212");
JSON.toJSONString(map ) 后得到結果為: {"password":"125454","addTime":"1610977949556","phone":"12121212","id":"1","email":"112312312"}
可以看到數據已經不一致了 然后導致加密之后算出來的秘鑰 不一致 導致接口簽名錯誤
這里指的注意的是 JSON.toJSONString() 在對對象進行轉換時, 默認按照 字母的順序來排序的,(這里測試了,跟實體類的書寫順序和set的順序無關)
而 對map 進行轉換時, 順序是錯亂的,具體的順序我還沒找到
解決方案
- 讓調用方 建立一個請求對象在進行轉換
- 使用 LinkedHashMap 替換 HashMap
注:內容從作者本人的CSDN重新整理過來的 所以圖片有水印