java中Cookie使用问题(message:invalid character [32] was present in the Cookie value)

Posted eager

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中Cookie使用问题(message:invalid character [32] was present in the Cookie value)相关的知识,希望对你有一定的参考价值。

1、 问题描述

Servlet中执行下面一段代码:

   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        System.out.println( new Date().toString());
        
        Cookie cookie = new Cookie("lasttime",  new Date().toString());
        response.addCookie(cookie);

        String s = "欢迎您首次访问该网站!~";
        Cookie[] cookies = request.getCookies();
        if (cookies != null)
            for (Cookie cs : cookies) {
                if (cs.getName().equals("lasttime")) {
                    s = "您上次登录的时间为:" + cs.getValue().replace("-", " ");
                }
            }
        
        response.getWriter().print(s);
    }

抛出如下异常:

技术分享图片

 

2、 追根溯源

出现上述问题觉得很奇怪,因为程序编译通过,至少证明没有语法错误,根据编译器提示,定位问题到:

Cookie cookie = new Cookie("lasttime",  new Date().toString());
response.addCookie(cookie);

查看JAVAEE-API,发现有如下

技术分享图片

回过去看代码,发现

输入:

System.out.println( new Date().toString());
输出:

Fri Apr 20 21:56:39 CST 2018

很明显输出字符串中存在 空格 ,所以程序会报错,存在无效字符。

 

3、解决方案

解决问题的方法其实很简单,只要字符串中不存在空格即可成功,下面将给出几种具体的解决办法,程序修改如下:

法一

思路:用“-”代替“ ”,之后记得换回来即可,程序成功运行。
    
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        System.out.println( new Date().toString());
        
        Cookie cookie = new Cookie("lasttime",  new Date().toString().replace(" ", "-"));
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);

        String s = "欢迎您首次访问该网站!~";
        Cookie[] cookies = request.getCookies();
        if (cookies != null)
            for (Cookie cs : cookies) {
                if (cs.getName().equals("lasttime")) {
                    s = "您上次登录的时间为:" + cs.getValue().replace("-", " ");
                }
            }
        
        response.getWriter().print(s);
    }

法二

思路:进行URL编码,然后把编码后的字符串放到Cookie中,之后进行URL解码即可。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        System.out.println( new Date().toString());
        
        Cookie cookie = new Cookie("lasttime", URLEncoder.encode(new Date().toString(), "UTF-8"));
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);

        String s = "欢迎您首次访问该网站!~";
        Cookie[] cookies = request.getCookies();
        if (cookies != null)
            for (Cookie cs : cookies) {
                if (cs.getName().equals("lasttime")) {
                    s = "您上次登录的时间为:" + URLDecoder.decode(cs.getValue(), "UTF-8");
                }
            }
        response.getWriter().print(s);
    }

程序运行正常,符合预期值。

 

以上是关于java中Cookie使用问题(message:invalid character [32] was present in the Cookie value)的主要内容,如果未能解决你的问题,请参考以下文章

When can I get the "java.net.SocketException: Permission denied:connect" message? And how

java:Cookie(常用操作)

使用 TYPO3 中间件时如何添加 cookie?

怎么在java中使用cookie

在 Java 中使用 Selenium 接受 cookie

使用浏览器cookie