cookie遇到java.lang.IllegalArgumentException: Control character in cookie value or attribute


java.lang.IllegalArgumentException: Control character in cookie value or attribute.

該異常說明cookie中的value或屬性有控制字符,但是我設置的value並沒有特殊字符。
初步懷疑是中文編碼問題,於是在將字符串進行base64編碼之前先用Cookie cookie = new Cookie("name", URLEncoder.encode(str, "UTF-8"));將原字符串先進行utf-8編碼,但是結果還會有如上異常。
把原來字符串中的中文去掉,用英文代替,嘗試結果還是失敗,看來不是字符串編碼問題。

從網上檢索相關資料如下:
Cookie的長度限制:
(1) 瀏覽器所允許的每個域下的最大cookie數目,從網上找到的資料大概是這么個情況 
IE :原先為20個,后來升級為50個 
Firefox: 50個 
Opera:30個 
Chrome:180個 
Safari:無限制 

當Cookie數超過限制數時瀏覽器的行為:IE和Opera會采用LRU算法將老的不常使用的Cookie清除掉,Firefox的行為是隨機踢出某些Cookie的值。當然無論怎樣的策略,還是盡量不要讓Cookie數目超過瀏覽器所允許的范圍。

(2) 瀏覽器所允許的每個Cookie的最大長度 
Firefox和Safari:4079字節 
Opera:4096字節 
IE:4095字節 

我們這里關心的是cookie最大長度,IE支持的最大cookie長度可達4095字節,但是這個長度應該是整個cookie對象的大小,如何計算還不清楚。
我這邊IE9測試結果是,value的長度最大是76個字符,這個是經過base65編碼后的,編碼前的原始字符串長度要比這個更小。
另外,嘗試將cookie的name長度減小,發現value的最大支持長度還是沒變,應該是個固定值。
如果要保存比較多的數據,要么使用多個cookie,要么保存數據庫的id等關鍵信息,下次取出后再查詢數據庫或讀文件等。

以上的解決辦法都嘗試了,雖然系統運行正常,cookie也保存了,也可以正常記住密碼並且登錄。可是后台還是報錯Control character in cookie value or attribute

后來才發現測試服務器環境與本地開發環境不一樣,測試服務器Tomcat為7.0版本,而本地開發環境tomcat為8.5,

環境不統一就會出現各種千奇百怪的異常,在此提醒大家開發環境、測試、正式環境軟件版本一定要統一!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM