先来一张异常图片:500错误,Cookie值中存在无效字符

java 后端增加cookie_servlet

常见原因分析:

我们将数据存储到 Cookie 中时,需要注意避免包含特殊字符、空格以及非 ASCII 字符。这是因为 Cookie 存储的值需要符合一定的格式规范,如果值中包含了无效字符,就可能导致 Cookie 无法正确解析,从而产生问题。

常见导致 Cookie 值中存在无效字符的原因包括:

  1. 特殊字符和空格: 一些特殊字符如分号、逗号、等号等在 Cookie 值中可能会引发解析问题。另外,值中的空格也会引起问题。
  2. 非 ASCII 字符: Cookie 值应该是 ASCII 字符集中的字符,非 ASCII 字符(如中文、特殊符号等)需要进行编码转换,通常使用 URLEncoder.encode( )进行编码。
  3. 长度限制: Cookie 的总长度有限制,不同浏览器可能有不同的限制,超过限制的值可能会被截断。
  4. 换行和制表符: 值中的换行符和制表符也会导致 Cookie 解析问题。

解决方法: 

这里我们详细说明一下第二个原因:

举一个例子,当我在前端获取了一个参数,将参数存储到List<Merchandise>集合中,然后将List集合转化为JSON,并将JSON存储在Cookie中,此时就会出现Cookie值中存在无效字符的错误

解决方法:通过URLEncoder.encode()对所要存储的数据进行UTF-8编码,大致代码如下:

String listCookieJson = JSON.toJSONString(listCookie);
String encodedListCookieJson = URLEncoder.encode(listCookieJson, "UTF-8"); 
Cookie cookie = new Cookie("listCookieJson", encodedListCookieJson);
System.out.println("listCookieJson=" + encodedListCookieJson);
cookie.setMaxAge(60 * 60 * 24 * 10);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
System.out.println("新的Cookie更换了");
response.sendRedirect(request.getContextPath() + "/success.jsp");

Cookie存储数据长度说明

在现代的 Web 浏览器中,不同浏览器对于 Cookie 的存储大小限制有所不同。下面是一些常见浏览器对 Cookie 存储大小的限制:

  • Google Chrome: 大约 4096 字节(4 KB)。
  • Mozilla Firefox: 大约 4096 字节(4 KB)。
  • Safari: 大约 4096 字节(4 KB)。
  • Microsoft Edge: 大约 4096 字节(4 KB)。
  • Internet Explorer: 大约 4095 字节(4 KB)。

这些大小限制是近似值,并且可能会因浏览器版本、操作系统和其他因素而有所变化。由于浏览器的存储大小限制,您应该谨慎存储数据到 Cookie 中,特别是当您需要存储大量数据时,可能需要考虑其他存储机制,如 Web Storage(LocalStorage 或 SessionStorage)或服务器端存储。

但是我们一般在Cookie中进行数据存储时,基本上不会超过这一个长度,如果出现了无效字符,请从其他原因进行分析。