電商項目購物車模塊,要求用戶在非登錄情況下也可將商品加入購物車,因此設計如下:
1.如果添加購物車時,用戶已經登錄,則將購物車數據儲存到redis和數據庫中,而且數據要保持一致,用戶查詢時從redis中獲取;
2.如果添加購物車時,用戶未登錄,則將購物車數據添加到cookie中,查詢、修改和刪除也在cookie中進行;如果用戶登錄成功,則通知將cookie中的購物車數據持久化到數據庫和redis中。
用戶未登錄時,將購物車加入cookie,代碼如下:
此處的cookieKey生成規則是:GoodsCart_goodsId_property,其中property為propertyId:propertyValueId,多個之間以“_”相連,例如 1:23_2:24_3:25。
從cookie中查詢購物車信息,代碼如下:
但是,查詢出來的cookie數組中只有一個cookie,即JSESSSIONID,並沒有我存進去的購物車信息,然后在瀏覽器中查看cookie,發現已經存在,但是就是讀取不出來。
解決方案:
經過排查,是因為cookie的特殊字符的原因,“:”是cookie中特殊字符,所以從cookie中讀取時出現數據丟失或者解析錯誤;
一個較好的解決辦法就是:在將cookie值寫入客戶端瀏覽器之前,首先進行URLEncode編碼,讀取cookie時,進行URLDecode即可。
加入購物車:
查詢購物車:
問題完美解決。