Buffalo中Cookie操作需区分环境:生产环境用c.SetCookie()写入/删除(MaxAge=-1覆盖同名同Path Cookie),测试环境因session中间件禁用,需手动AddCookie或伪造cookies映射。

在Buffalo框架中写入和删除Cookie必须区分运行环境:生产环境走标准HTTP Set-Cookie响应头,测试环境因session中间件未启用而无法通过c.Session().Set()持久化,需直接操作ResponseWriter或绕过中间件。
生产环境写入Cookie
使用c.SetCookie()方法,它会自动调用http.SetCookie并注入到ResponseWriter中。
调用c.SetCookie(&http.Cookie{Name: "theme", Value: "dark", Path: "/", MaxAge: 86400, HttpOnly: true}) → Cookie将随HTTP响应头发出。
MaxAge设为0表示浏览器关闭即失效;设为负数(如-1)则立即删除(但需配合Path一致才能清除成功);不设MaxAge则成为会话Cookie,【关闭浏览器后自动清除】。
HttpOnly设为true可防止JS读取,增强XSS防护能力;Path必须与读取时的路径严格一致,否则c.Cookies()无法获取。
生产环境删除Cookie
删除本质是覆盖:用同名、同Path、MaxAge=-1、Value为空字符串的Cookie覆盖原有值。
c.SetCookie(&http.Cookie{Name: "auth_token", Value: "", Path: "/", MaxAge: -1, HttpOnly: true})
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
这一步必须确保Path与当初写入时完全相同,否则旧Cookie仍存在于其他路径下;Domain字段若当初设过,此处也必须显式传入相同值,否则无法匹配删除。
测试环境模拟Cookie写入与删除
Buffalo测试环境默认禁用session中间件,c.Session().Set()无效,也无法靠c.SetCookie()触发真实Set-Cookie头——因为test server不执行WriteHeader逻辑。
方法一:手动构造带Cookie头的请求
用http.NewRequest("GET", "/dashboard", nil)创建原始req → req.AddCookie(&http.Cookie{Name: "user_role", Value: "admin"}) → ts.Client().Do(req)
方法二:在Context中伪造Cookie映射(仅用于handler内部读取)
在测试setup中调用c.Set("cookies", map[string]string{"user_role": "admin"}),然后在handler里改用c.Get("cookies").(map[string]string)读取——这跳过了HTTP层,仅适用于不依赖真实Cookie解析逻辑的单元测试。
注意:【ts.JSON("/api/data")这类快捷方法无法携带Cookie】,必须用ts.Client().Do(req)底层调用。

















