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.οnlοad=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转换编码后的字符串。