Express设置Cookie时值被百分号编码、字符替换未全生效问题
问题根因
你遇到的两个异常分别是代码逻辑问题和框架默认行为导致的:
- 字符替换只生效第一个:JavaScript的
String.replace方法如果第一个参数传普通字符串、或者不带全局匹配标志g的正则,只会替换第一个命中的目标。你写的.replace(":", "=")、.replace(",", ";")都是普通字符串匹配,没有加全局匹配,所以只会替换第一个冒号、第一个逗号,后面的同名字符完全不会被处理。另外你写的移除大括号、双引号的正则也有问题:"是HTML场景下的双引号转义实体,JS运行时JSON.stringify输出的双引号就是普通的"字符,这个正则根本匹配不到实际的双引号,自然删不掉。 - Cookie值自动百分号编码:你用的是Express框架的
res.cookie方法,这个方法默认会对传入的Cookie值调用encodeURIComponent做URL编码,是为了符合Cookie规范,避免值里出现分号、空格这类保留字符导致Cookie解析失败,你看到的%3D对应=、%40对应@、%3B对应;,都是默认编码后的正常结果。
正确写法
不建议手动做字符串替换拼Cookie值,后续读取的时候反序列化很容易出兼容问题,优先用框架自带的序列化能力:
// 直接传入原始对象即可,框架会自动处理序列化、编码,不需要手动转JSON、替换字符 response.cookie('lgadasdadfdvqwdsfgweklfcwevw_wdwcbwecwv_Wdwd', dados, { maxAge: 900000, httpOnly: false });
后续读取Cookie时,配合常规的Cookie解析中间件就能直接拿到原始的对象值,不需要额外做解码、反序列化处理。
如果你确实需要自定义Cookie值格式,要先把替换逻辑修正为全局匹配,再手动关闭框架的默认编码(非特殊场景不推荐,容易出现跨浏览器兼容问题):
const cookieVal = JSON.stringify(dados) .replace(/:/g, '=') // 加g标志全局替换所有冒号 .replace(/[{}"]/g, '') // 全局匹配移除大括号、普通双引号 .replace(/,/g, ';'); // 加g标志全局替换所有逗号 response.cookie('lgadasdadfdvqwdsfgweklfcwevw_wdwcbwecwv_Wdwd', cookieVal, { maxAge: 900000, httpOnly: false, encode: v => v // 覆盖默认编码逻辑,直接返回原值不做URL编码 });
注意:关闭自动编码后,如果你的Cookie值里出现分号、逗号、换行、中文这类Cookie规范保留/不支持的字符,会直接导致Cookie写入失败或者解析错乱。
内容的提问来源于stack exchange,提问作者Daniel David
相关产品推荐
相关产品推荐

