解决java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value错误

问题阐述

最近在学习Java Web,今天使用Eclipse编写一个Cookie的一个示例,模拟网站回显用户上次访问时间,代码如下:

package cn.jkdev;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/HistServlet")
public class HistServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        // 获取当前时间
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String curTime = format.format(new Date());

        // 取得cookie
        Cookie[] cookies = request.getCookies();
        String lastTime = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("lastTime")) {
                    // 第n次访问
                    // 有lastTime的cookie
                    lastTime = cookie.getValue();// 上次访问的时间
                    // 1.把上次显示时间显示到浏览器
                    response.getWriter().write("欢迎回来,你上次访问的时间为:" + lastTime + ",当前时间为:" + curTime);
                    // 2.更新cookie
                    cookie.setValue(curTime.trim());
                    cookie.setMaxAge(3600);
                    // 3.把更新后的cookie发送到浏览器
                    response.addCookie(cookie);
                    break;
                }
            }
        }

        /**
         * 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)
         */
        if (cookies == null || lastTime == null) {
            // 1.显示当前时间到浏览器
            response.getWriter().write("你是首次访问本网站,当前时间为:" + curTime);
            // 2.创建Cookie对象
            Cookie cookie = new Cookie("lastTime", curTime);
            cookie.setMaxAge(3600);
            // 3.把cookie发送到浏览器保存
            response.addCookie(cookie);
        }
    }
}

当我在浏览器测试,多次点击后,依然如图下图显示效果
01.png
令人费解,于是看控制台输出信息,发现以下错误:

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

原来如此,Cookie的值是非法的,非法字符是character [32],于是我找到对应的ASCII码表,如下图,character [32]对应的是一个空格,这样是不可以的。
ASCII.jpg

解决办法:

1.在构造Date字符串的时候不要使用空格,使用其他字符来替换,这种方法比较简单。
2.如果非要使用空格来隔开日期与时间,我们需要对其进行编码就可以了,但是读取的时候不要忘记了解码,不然在用户界面上会出现乱码。
(1)对Date字符串进行编码:

String curTime = URLEncoder.encode(format.format(new Date()), "utf-8");

(2)读取的时候进行解码:

response.getWriter().write("欢迎回来,你上次访问的时间为:" + URLDecoder.decode(lastTime, "utf-8") + ",当前时间为:" + URLDecoder.decode(curTime, "utf-8"));

好了,再刷新浏览器两次,正常显示想要的效果的:
02.png

所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!

评论已关闭

  关于博主

灵魂的一半是学识,另一半是骨子里的涵养!

  近期评论

  • 暂无评论

很多东西宁缺毋滥,流星的光芒短暂而灼热闪耀。

让你变得更好的那个人,往往是你觉得很难与之相处的那个人。—— by 小宇

觉得自己做的到和不做的到,其实只在一念之间。

路在自己脚下,没有人可以决定我的方向。

你的选择是做或不做,但不做就永远不会有机会。

凡事顺其自然,遇事处于泰然,得意之时淡然,失意之时坦然,艰辛曲折必然,历尽沧桑悟然。