返回

在后台注入 Cookie 的曲折过程

前端

前言

最近我在做一个小项目,需要在后台注入 Cookie。一开始以为很简单,直接在代码中设置 Cookie 就可以了。然而,当我实际操作时,却遇到了不少问题。经过一番折腾,终于搞定了。现在把这个过程记录下来,分享给大家。

遇到的问题

  1. 跨域问题

当我在前端请求中不携带 Cookie 时,服务端设置 Cookie:

<?php
setcookie('name', 'value');

这时不会报错,但是 Cookie 却不会被注入。这是因为跨域限制。

解决方法:

  • 在服务端设置 Access-Control-Allow-Origin 头部,允许跨域请求。
  • 在前端请求中设置 Origin 头部,指定请求的来源。
<?php
header('Access-Control-Allow-Origin: *');
const request = new Request('https://example.com', {
  headers: {
    'Origin': 'https://example.com',
  },
});
  1. Cookie 名字不能以数字开头

PHP 中,Cookie 名字不能以数字开头。这是因为数字开头会被解析为十进制数字,导致 Cookie 名字不合法。

解决方法:

  • 不要使用数字开头的 Cookie 名字。
  • 在 Cookie 名字前加一个字母。
<?php
setcookie('1name', 'value');
  1. Cookie 值不能包含某些特殊字符

Cookie 值不能包含某些特殊字符,如分号、逗号、空格等。这是因为这些字符会被解析为分隔符,导致 Cookie 值不合法。

解决方法:

  • 不要使用包含特殊字符的 Cookie 值。
  • 对 Cookie 值进行编码。
<?php
setcookie('name', urlencode('value'));
  1. Cookie 过期时间不能为负数

Cookie 过期时间不能为负数。这是因为负数表示 Cookie 已经过期,会被浏览器忽略。

解决方法:

  • 不要使用负数的 Cookie 过期时间。
  • 将 Cookie 过期时间设置为 0,表示 Cookie 永不过期。
<?php
setcookie('name', 'value', 0);
  1. Cookie 大小不能超过 4KB

Cookie 大小不能超过 4KB。这是因为浏览器的限制。

解决方法:

  • 不要使用超过 4KB 的 Cookie。
  • 将 Cookie 拆分成多个部分。

总结

以上就是我在后台注入 Cookie 时遇到的问题以及解决方法。希望对大家有所帮助。

参考资料