Tomcat若出現如下錯誤:java.lang.IllegalArgumentException: Control character in cookie value or attribute.如下圖所示:
產生該問題原因:Cookie處理中文時編碼問題,中文采用的是Unicode編碼,而英文采用的是ASCII編碼,當Cookie保存中文的時候需要對中文進行編碼,而且從Cookie中取出內容的時候也要進行解碼。下面舉一個例子來解決該問題:
<script type="text/javascript"> /*添加cookie*/ function setCookie(name,value,outTime){ var expdate=new Date(); var outms=outTime*24*60*60*1000;//過期時間,以天為單位‘1’表示一天 expdate.setTime(expdate.getTime()+outms); var cookieStr=name+"="+escape(value)+";expires="+expdate.toGMTString(); //escape方法的作用是進行編碼,主要防止value中有特殊字符 document.cookie=cookieStr; } /*刪除cookie cookie的刪除並不是物理意義上的直接刪除, 而是將cookie的有效期設置為失效,然后由瀏覽器刪除失效的cookie刪除 */ function deleteCookie(cookiename){ var date = new Date(); var outTime=date.getTime()-1000;//將cookie的有效期設置為失效 date.setTime(outTime); document.cookie=cookiename+"='';expires="+date.toGMTString(); } /*讀取cookie*/ function getCookie(cookieName){ var cookieStr=document.cookie; var cookievalue=""; if(cookieStr!=null &&cookieStr!=undefined){ var arrayCookie=cookieStr.split(';'); for(var i=0;i<arrayCookie.length;i++){ var arrayDetail=arrayCookie[i].split('='); if(i==0){ cookiMap='{"'+arrayDetail[0]+'":"'+arrayDetail[1]+'",'; }else if(i==arrayCookie.length-1){ cookiMap+='"'+arrayDetail[0]+'":"'+arrayDetail[1]+'"}'; }else{ cookiMap+='"'+arrayDetail[0]+'":"'+arrayDetail[1]+'",'; } } } var s=cookiMap.replace(/\s/g,"");//去掉字符串中空格 var cookieObj=JSON.parse(s); for(var item in cookieObj){ if(item==cookieName){ cookievalue=unescape(cookieObj[item]); } } return cookievalue; } window.onload=function(){ var jsonObj={"姓名":"ycyzharry","年齡":"28","職業":"程序員"} setCookie("abc",JSON.stringify(jsonObj),2);//在cookie中寫入json串 setCookie("abd","hello word",2);// 寫入cookie setCookie("abe","編程",2); var s={'abc':'{"姓名":"ycyzharry","年齡":"28","職業":"程序員"}','abd':'hello word','abe':'編程'}; deleteCookie('abe'); //刪除cookie alert(getCookie('abe'));//根據key值獲取cookie } </script>
總結:使用escape對字符串進行編碼,編碼的目的是防止在cookie中出現特殊字符,用unescape轉換編碼后的字符串。