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);
    }

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

原文地址:https://www.cnblogs.com/eager/p/8893881.html

时间: 2024-08-28 20:22:26

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

cookie设置日期时间有空格报错:java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

rt,代码及报错如下: java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value 现暂时将"yyyy-MM-dd hh:mm:ss"中的空格用#替代,就能正常显示时间日期了...

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

今天在练习 cookie时意外的报了这个错. java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value1这句话的意思是 一个不识别的字符[32]出现在了cookie当中 由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中32对应的就是空格.只要把后台代码中的空格删掉就可以了. 我的代码:是在cookie中添加了时间,而时间的格

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

创建时间:6.30 java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value 报错原因: Tomcat 8.5版本,在cookie值中不能使用空格. 代码: 1 protected void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException

An invalid character [32] was present in the Cookie value

HTTP Status 500 – Internal Server Error Type Exception Report Message An invalid character [32] was present in the Cookie value Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception java.l

Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解决

eclipse中遇到了Syntax error on token "Invalid Character", delete this token(令牌"无效字符"上的语法错误,删除此令牌)的错误提示,看代码是完全没有问题,上网查了半天发现遇到这个问题的好像不太多,总结一下问题原因和解决方案: 1.看到这个提示首先想到的是标点符号是不是中文,或者全角半角的问题了,通过检查,这种问题并不存在. 2.然后看到一个帖子说用Android Studio引入eclipse项目时遇

go语言中的invalid character '\x00' after top-level value

设计的一个项目,需要从客户端中,发生一个结构体信息给服务端,服务端对接收到的信息进行验证.这里我考虑的是将结构体转换为json,然后传递至服务端,服务端解析json即可. 由于json的数据格式就是[]byte,所以在网络传递中不需要转换,直接传递就可以了.对方接收到[]byte数据,也就是json数据,直接json解析就行了. 然而,在服务端中解析时,显示invalid character '\x00' after top-level value. 结构体代码: type Message st

java中 this关键字的用法总结

JAVA中this用法总结 2013-07-22 17:06:32|  分类: 技术类_JAVA|举报|字号 订阅 JAVA中this用法总结 1.强调本类中的方法 class Person{ private String name;        //声明姓名属性 private int age;        //声明年龄属性 public void tell(){        //取得信息的方法 System.out.println("姓名:"+getName()+"

JAVA中如何读写COOKIE

Java中删除cookie Cookie[] cookies=request.getCookies(); //cookies不为空,则清除 if(cookies!=null) { String value=cookies[0].getName(); //查找用户名 if(value.equals("userName")) { cookies[0].setMaxAge(0); response.addCookie(cookies[i]); } } Java中如何读写cookie //写c

java中使用request.getCookies删除所有cookie

今天在处理一个删除cookie的需求.我在查询页面的时候将查询条件添加到了cookie中,这样,下一次查询的时候,我就可以带上上一次查询的条件.但是,再切换组织机构和退出登录的时候,需要删除所有的cookie. //这里为了说明问题,只是嵌入了代码的一部分 @RequestMapping public ModelAndView index( @RequestParam(value = "channelName", required = false) String channelName