您的位置:首页 > 产品设计 > UI/UE

Control character in cookie value or attribute

2016-10-15 00:00 465 查看
Servlet操作Cookie方法可查看该文章: http://elf8848.iteye.com/blog/253198
以下是我遇到的问题:

在servlet在设置用户订单信息到cookie中时出现以下异常:

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

at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:193)

at org.apache.tomcat.util.http.CookieSupport.isHttpToken(CookieSupport.java:217)

at org.apache.tomcat.util.http.ServerCookie.appendCookieValue(ServerCookie.java:186)

at org.apache.catalina.connector.Response.generateCookieString(Response.java:1030)

at org.apache.catalina.connector.Response.addCookie(Response.java:972)

该异常说明cookie中的value或属性有控制字符,但是我设置的value并没有特殊字符。

初步怀疑是中文编码问题,于是在将字符串进行base64编码之前先用URLEncoder.encode(s, "UTF-8") 将原字符串先进行utf-8编码,但是结果还会有如上异常。

把原来字符串中的中文去掉,用英文代替,尝试结果还是失败,看来不是字符串编码问题。

由于编码前的字符串是由用户名,手机号等多个字符串拼接起来,难道是拼接过程产生问题?

尝试只使用表单中的用户名字符串,结果可以成功保存cookie,当再多加几个字符串时,还是会出现失败情况。

可以看出这里应该是长度限制问题。

从网上检索相关资料如下:

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
相关文章推荐