开发避坑短篇(8):Java Cookie值非法字符异常分析与解决方案:IllegalArgumentException[32]
异常信息
javajava.lang.IllegalArgumentException: An invalid c0haracter [32] was present in the Cookie value。
异常背景
spring web项目,从tomcat7迁移到tomcat8后运行报错。
异常分析
翻译异常信息:java.lang.IllegalArgumentException: Cookie值中包含非法字符。Cookie值中不允许包含空格等特殊字符,ASCII码32对应空格字符。经查阅资料,了解到Tomcat8新增了对HTTP请求头和Cookie值的严格校验,ASCII码32(空格)等特殊字符会被拒绝,这与新升级的RFC 6265规范相关。常见触发场景(1)URL或Cookie值包含空格、花括号等字符。(2)时间格式化字符串直接作为Cookie值(如"yyyy-MM-dd HH:mm:ss")。
(3)请求头或参数中存在未编码的特殊字符。
解决办法
修改tomcat目录下的配置文件\conf\context.xml,指定CookieProcessor为org.apache.tomcat.util.http.LegacyCookieProcessor,具体配置如下:
CookieProcessor 是 Tomcat 的核心组件,负责解析 HTTP 请求中的 Cookie 头部javax.servlet.http.Cookie 对象,并在响应时将 Cookie 对象转换为标准的 Set-Cookie 头部返回给客户端。LegacyCookieProcessor 是 Tomcat 早期版本中用于解析和生成 Cookie 的核心组件,其核心作用主要有:
(1)允许特殊字符:与严格遵循 RFC 6265 规范的 Rfc6265CookieProcessor 不同,LegacyCookieProcessor 对 Cookie 值中的特殊字符(如 空格(ASCII 32)、中文、花括号等)容忍度更高,不会因这些字符触发 IllegalArgumentException 异常。
(2)兼容历史代码:适用于从 Tomcat 7 或 8.0 迁移至 Tomcat 8.5+ 时,处理遗留系统中未严格编码的 Cookie 值。