🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔧 ​​一、问题根源​​

🛠️ ​​二、解决方案:编码与解码​​

​​通用流程​​

​​具体技术实现​​

⚠️ ​​三、关键注意事项​​

💎 ​​四、总结​​


img

要解决Cookie值不允许直接存储中文的问题(如乱码或报错Control character in cookie value or attribute),核心方案是通过​​URL编码/解码​​确保中文字符符合HTTP协议对ASCII字符的要求。以下是具体方法及注意事项:


🔧 ​​一、问题根源​

  • ​协议限制​

    HTTP协议规定Cookie值仅支持ASCII字符,中文等非ASCII字符需编码后存储,否则会引发乱码或服务器报错。

  • ​浏览器兼容性​

    部分浏览器(如Safari)严格限制非ASCII字符,未编码的中文会导致Cookie存储失败。


🛠️ ​​二、解决方案:编码与解码​

​通用流程​
graph LR
A[原始中文字符] --> B[URL编码] --> C[存储到Cookie]
C --> D[读取Cookie值] --> E[URL解码] --> F[还原中文]
​具体技术实现​
  1. ​前端 JavaScript​

    • ​设置Cookie​​:用encodeURIComponent()编码

      function setCookie(name, value, days) {
          const encodedValue = encodeURIComponent(value); // 编码中文
          document.cookie = `${name}=${encodedValue}; path=/; max-age=${days*86400}`;
      }
      setCookie("user", "张三", 7); // 示例
    • ​读取Cookie​​:用decodeURIComponent()解码

      function getCookie(name) {
          const match = document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`);
          return match ? decodeURIComponent(match[2]) : null; // 解码中文
      }
      console.log(getCookie("user")); // 输出“张三”
  2. ​Java 后端(Servlet)​

    • ​写入Cookie​​:用URLEncoder.encode()编码

      String name = "张三";
      String encodedName = URLEncoder.encode(name, "UTF-8"); // UTF-8编码
      Cookie cookie = new Cookie("user", encodedName);
      response.addCookie(cookie);
    • ​读取Cookie​​:用URLDecoder.decode()解码

      Cookie[] cookies = request.getCookies();
      for (Cookie c : cookies) {
          if ("user".equals(c.getName())) {
              String decodedName = URLDecoder.decode(c.getValue(), "UTF-8"); // 解码
          }
      }
  3. ​PHP 后端​

    • ​设置Cookie​​:urlencode()编码

      setcookie("user", urlencode("张三"), time()+3600, "/");
    • ​读取Cookie​​:urldecode()解码

      if (isset($_COOKIE["user"])) {
          echo urldecode($_COOKIE["user"]); // 输出“张三”
      }
  4. ​.NET 后端​

    • ​编码​​:HttpUtility.UrlEncode()

    • ​解码​​:HttpUtility.UrlDecode()

      (需与前端decodeURIComponent()配对使用)。


⚠️ ​​三、关键注意事项​

  1. ​编码一致性​

    • 所有环节(编码/解码)必须统一使用 ​​UTF-8​​,混用GBK等字符集会导致乱码。

  2. ​特殊字符处理​

    • 空格会被编码为+,需手动替换为%20;分号、逗号等保留字符也必须编码,避免破坏Cookie格式。

  3. ​浏览器与服务器兼容性​

    • ​Tomcat 8+​​:支持直接存中文,但特殊字符仍需编码。

    • ​Safari​​:必须编码,否则拒绝存储。

  4. ​安全性与性能​

    • ​敏感信息​​:避免存Cookie,或通过HTTPS传输。

    • ​大小限制​​:单个Cookie值≤4KB,超长文本改用LocalStorage


💎 ​​四、总结​

​场景​

​推荐方法​

​工具函数/API​

前端JavaScript

URL编码/解码

encodeURIComponent()/decodeURIComponent()

Java Servlet

URL编码/解码

URLEncoder/URLDecoder(java.net包)

PHP

URL编码/解码

urlencode()/urldecode()

.NET

URL编码/解码

HttpUtility.UrlEncode()/UrlDecode()

​最佳实践​​:

  • 始终显式编码中文,即使环境部分支持(如Tomcat 8+)。

  • 敏感操作(如支付)启用SecureHttpOnly标志提升安全性。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐