有关cookie中存放value值是json字符串引发的exception的问题解析
最近在往cookie的value中存放json字符串,会出现Control character in cookie value or attribute异常或者An invalid character [34] was present in the Cookie value异常等等。。那么该如何解决此类问题呢,下面我们跟随着代码一步步查看下
在我们将String值或者是json字符串存放到cookie的时候都要先经过validateCookieValue这个方法,如下所示
我们看一下这个方法,其中在对value值做array处理的时候是验证了其中的每一个字符,其中针对if语句中的则是直接抛出异常,于是就有了我们Control character in cookie value or attribute.其中0x21,0x22是十六进制的表示数字,其中对应的位置分别是33 ,34;
那么问题就来了,为什么当这些字符为0x21,0x22的时候是异常呢?
最近在往cookie的value中存放json字符串,会出现Control character in cookie value or attribute异常或者An invalid character [34] was present in the Cookie value异常等等。。那么该如何解决此类问题呢,下面我们跟随着代码一步步查看下
在我们将String值或者是json字符串存放到cookie的时候都要先经过validateCookieValue这个方法,如下所示
private void validateCookieValue(String value) {
int start = 0;
int end = value.length();
if (end > 1 && value.charAt(0) == '"' && value.charAt(end - 1) == '"') {
start = 1;
end--;
}
char[] chars = value.toCharArray();
for (int i = start; i < end; i++) {
char c = chars[i];
if (c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f) {
throw new IllegalArgumentException(sm.getString(
"rfc6265CookieProcessor.invalidCharInValue", Integer.toString(c)));
}
}
}
我们看一下这个方法,其中在对value值做array处理的时候是验证了其中的每一个字符,其中针对if语句中的则是直接抛出异常,于是就有了我们Control character in cookie value or attribute.其中0x21,0x22是十六进制的表示数字,其中对应的位置分别是33 ,34;
那么问题就来了,为什么当这些字符为0x21,0x22的时候是异常呢?
首先讲一下,cookie包含的编码方式是ASCII吗,那么我们在使用解析的时候则是使用的是GBK或者UTF-8编码;谈到这里,那么问题就来了,ASCII码中0X21,0X22对应的字符是什么,我们需要查一下ASCII码的对照表就可以了,ok,我们下面看一下对应的ASCII表
其中红色的标注的是随意指定的两个,相信大家看了上买你的图之后就清楚为什么报那个异常了;
那么如何解决呢?
在java中提供的有URLEncoder.encode和URLDecoder.decode 两个编解码的方法,这样问题是不是就迎刃而解了,具体如下:
URLEncoder.encode(name, "utf-8");
URLDecoder.decode(cookies[i].getName(),"utf-8")