Tomcat报错Control character in cookie value or attribute.

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转换编码后的字符串。

 

posted @   ycyzharry  阅读(28606)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示