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

当我在浏览器测试,多次点击后,依然如图下图显示效果


令人费解,于是看控制台输出信息,发现以下错误:

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

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


解决办法:

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

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


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值