Question : 今天在进行Cookie练习时不小心在输入框的value的值中敲入了一个空格
然后在运行时将该输入框的值加入到Cookie中时浏览器报异常提示java.lang.IllegalArgumentException:An invalid
character [32] was present in the Cookie value
代码及异常如下图
Analysis : 根据异常提示可知异常原因为Cookie值中有一个无效值空格存在
(character [32]就是ASCII码中的空格字符)
而在Cookie的名称和值中都不允许下面这些字符存在
空格 [ ] ( ) = , " / ? @ : ;
只要向Cookie中添加的键值对中有这些符号就会报下面的异常,32为上面字符的ASCII码
java.lang.IllegalArgumentException:An invalid character [32] was present in the Cookie value
Solution : 一. 添加Cookie时不需要空格等不允许的字符
可以在将字符串添加到Cookie键值对之前对输入的字符串检测是否有不允许存在的字符
public boolean hasDisallowChar(String string){
char[] disallowChar = {' ','[',']','(',')','=',',','"','/','?','@',':',';'};
for(int i=0;i<string.length();i++){
for(int j=0;j<disallowChar.length;j++){
if(string.charAt(i)==disallowChar[j]){
return false;
}
}
}
return true;
}
二. 添加Cookie时需要空格等不允许的字符
可以使用下面的方法将从输入框获得的字符串进行转码与字符串解码
<%--使用UTF-8编码机制将字符串转换为 application/x-www-form-urlencoded 格式 --%>
<%
//此时uname的value值中有空格
request.setCharacterEncoding("UTF-8");
//将request中uname指定的参数给字符串name
//String name = request.getParameter("uname");
//将uname字符串变为application/x-www-form-urlencoded 格式
//此例中uname字符串中有空格,转换后可正常输出name中的空格
String name =URLEncoder.encode(request.getParameter("uname"),"UTF-8");
//out.print(name);
Cookie cookie = new Cookie("username",name);
if(name!=""){
response.addCookie(cookie);
out.print("添加Cookie成功");
}
%>
<%--使用UTF-8编码机制对 application/x-www-form-urlencoded 字符串解码 --%>
<%
Cookie[] cookies = request.getCookies();
//判断是否存在键为"username"的Cookie,若存在则获取该Cookie的值
for(Cookie cookie : cookies){
if(cookie.getName().equals("username")){
//将Cookie的值使用UTF-8编码方式进行字符串解码
username = URLDecoder.decode(cookie.getValue(),"UTF-8");
out.print(username);
}
}
%>