PHP如何将json_encode结果正确存入Cookie 避免JS解析报错
问题原因
你使用的Cookie存储逻辑默认会自动对值做URL编码:PHP原生的setcookie方法本身就会自动转义特殊字符,大部分PHP框架封装的Cookie类也默认继承了这个逻辑,所以你存入的JSON字符串的{、"等特殊字符都会被转为%XX格式的URL编码字符,前端直接读取后自然不是合法的JSON结构,触发解析错误。
解决方案
你可以根据业务情况任选以下两种方案:
方案1:前端侧处理(推荐,改造成本最低)
读取Cookie后先做URL解码,再调用JSON.parse解析即可,示例代码如下:
// 读取Cookie的通用方法,可替换为你自己的原有逻辑 function getCookie(cookieName) { const name = cookieName + "="; const decodedCookie = decodeURIComponent(document.cookie); const ca = decodedCookie.split(';'); for(let i = 0; i <ca.length; i++) { let c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } // 解码+解析 const rawCookieValue = getCookie('你的Cookie名称'); const config = JSON.parse(decodeURIComponent(rawCookieValue));
方案2:后端侧关闭Cookie自动编码
如果希望Cookie直接存储原始JSON字符串,不需要前端额外处理,可以修改存储逻辑:
- 如果你是用PHP原生方法封装的Cookie类,将
setcookie替换为setrawcookie即可,后者不会自动对值做URL编码 - 如果你使用的是PHP框架的Cookie组件,查找对应关闭自动编码/自动加密的配置:比如Laravel框架可以先将该Cookie名称添加到
App\Http\Middleware\EncryptCookies的$except排除加密列表,存储时调用Cookie::raw方法生成原始Cookie即可。
内容的提问来源于stack exchange,提问作者Taurus Silver
相关产品推荐
相关产品推荐

