Webman中设置Cookie必须通过Response对象或Cookie组件,expire参数单位为秒而非时间戳,需显式配置auto_encrypt和app_key才能加密,HttpOnly、Secure等安全选项也须手动指定。

Webman 中操作 Cookie 不能直接用 setcookie(),必须走框架封装的响应对象或 Cookie 组件;加密和有效期需显式配置,不启用自动加密时值是明文的。
Webman 设置 Cookie 必须用 Response 对象或 Cookie 类
Webman 是基于 PSR-7 的轻量框架,所有输出必须通过 Response 实例返回,setcookie() 在中间件或控制器中调用无效(已发过 Header 或非 PSR-7 方式)。
- 正确方式:在控制器中返回带 Cookie 的响应,例如
return response('ok')->withCookie('theme', 'dark', ['expire' => 3600]) - 或使用
support/cookie组件:Cookie::set('token', $val, ['expire' => 7200, 'httponly' => true, 'secure' => true]) - 错误方式:写
setcookie('name', 'val')—— 框架不会拦截,但很可能因 Header 已发送而静默失败 - 注意:
Cookie::set()写入的是响应头,不是立即发送;它依赖当前响应生命周期,若你手动 echo 或提前输出,Cookie 会丢失
有效期必须传整数秒,不是时间戳
Webman 的 Cookie::set() 和 response()->withCookie() 的 expire 参数单位是「秒」,不是 Unix 时间戳 —— 这和原生 setcookie() 第三个参数完全不同,极易踩坑。
- 正确:
['expire' => 3600]表示 1 小时后过期 - 错误:
['expire' => time() + 3600]会被当作秒数处理,导致几百年后才过期(因为time()返回值约 17亿,远超合理范围) - 若要设为某具体日期,得自己换算:
['expire' => strtotime('2026-12-31') - time()],但更推荐用相对秒数,避免时区/服务器时间偏差影响 - 设为
0或负数,等效于会话 Cookie(关闭浏览器即失效)
加密 Cookie 需开启 auto_encrypt 并配 secret_key
Webman 默认不加密 Cookie 值,即使你用了 Cookie::set(),原始值仍以明文存于浏览器。加密必须主动开启且配置密钥,否则 Cookie::get() 读到的就是裸数据。
立即学习“PHP免费学习笔记(深入)”;
- 在
config/app.php中启用:'cookie' => ['auto_encrypt' => true] - 同时确保
config/app.php里有'app_key' => env('APP_KEY', 'your_32_bit_random_string_here'),这是加密所用密钥 - 密钥长度建议 32 字符(AES-256),用
php -r "echo bin2hex(random_bytes(32));"生成 - 加密后,
Cookie::get('name')会自动解密;但若密钥变更或 Cookie 被篡改,get()返回null(不报错) - 不加密时,敏感值如 token、user_id 明文可见,且可被前端随意修改 —— 千万别跳过这步
HttpOnly、Secure、SameSite 等安全选项要显式传
Webman 不默认开启任何安全标志,每个选项都得手动写进数组参数里,漏掉任一个都可能引入 XSS、CSRF 或混合内容风险。
-
'httponly' => true:阻止document.cookie读取,防 XSS 泄露 -
'secure' => true:强制仅 HTTPS 发送;HTTP 站点设为true后 Cookie 不会出现在请求头里 -
'samesite' => 'Lax':可选'Strict'、'Lax'、'None';若选'None',必须同时设'secure' => true -
'path' => '/'和'domain' => '.example.com'要按需限制作用域,避免子域名越权访问 - 别依赖浏览器默认行为 —— 比如 Chrome 当前对无
samesite的 Cookie 会警告并降级为Lax,但旧版 Safari 可能完全忽略
最易被忽略的是 expire 单位和 auto_encrypt 开关:一个写错让 Cookie 永不过期,一个没开让加密形同虚设。上线前务必用浏览器开发者工具检查 Set-Cookie 响应头里的 Max-Age 和 HttpOnly 标志是否真实存在。



















