Gin框架Cookie操作步骤详解

陌雪大大_7395

陌雪大大_7395

2026-10-16

763人浏览

原创

必须用c.setcookie(),它自动url编码、校验maxage类型、默认启用httponly和secure;禁用手动拼set-cookie或http.setcookie,避免xss与400错误。

gin框架cookie操作步骤详解

直接用 c.SetCookie() 和 c.Cookie() 就够了,别自己拼 Set-Cookie 头,也别调 http.SetCookie() —— 后者漏 URL 编码、类型错、HttpOnly 缺失,三秒内就能引出 XSS 或 400 错误。

怎么安全地设置 Cookie

必须用 c.SetCookie(),它已自动做三件事:值 URL 编码、maxAge 类型校验(只接受 int)、默认加 HttpOnly=true 和安全标志。手写容易翻车:

  • maxAge 传 time.Second * 3600?Go 会 panic,必须是纯整数秒,比如 3600
  • 值含中文或空格却不 url.QueryEscape()?浏览器拒收,返回 400 或静默丢弃
  • domain 填 "localhost:8080"?无效,开发填 "localhost",上线必须是 "example.com"(不含端口)
  • secure = true 却走 HTTP?浏览器直接不发该 Cookie,本地调试务必设 false

示例:设置一个 1 小时有效期、仅 HTTPS 传输、防 JS 访问的登录标识

c.SetCookie("auth_token", "abc123", 3600, "/", "example.com", true, true)

怎么正确读取和判断 Cookie

c.Cookie("name") 返回的是解码后原始值,不用再 url.QueryUnescape();错误时返回非 nil err,不是空字符串。

NotebookLM CLI Cookies
NotebookLM CLI Cookies

使用 nlm CLI 检索并回答已上传至 NotebookLM 的文档问题。适用于用户需要查找信息、总结来源或查询特定笔记本时。

下载
  • 不要写 if cookie == "" 判断是否存在 —— 正确方式是检查 err != nil
  • Cookie 值为 "%E4%BD%A0%E5%A5%BD"(UTF-8 编码)?c.Cookie() 已自动解码成 "你好"
  • 想兼容缺失场景?用带默认值的写法:cookie, _ := c.Cookie("theme"); if cookie == "" { cookie = "light" }

怎么可靠地删除 Cookie

服务器不能“删除”客户端 Cookie,只能覆盖它:同名 + 过期时间设为负数 + 路径/域名/Secure/HttpOnly 与原设置完全一致。

  • maxAge = -1 是标准做法,浏览器收到即刻移除
  • 路径不匹配?比如原 Cookie 是 path="/admin",删时用了 "/" → 删除失败
  • 域名不一致?原设 "example.com",删时填 "www.example.com" 或空字符串 → 失效
  • Secure 标志翻转?原为 true,删时传 false → 浏览器认不出是同一个 Cookie

登出时推荐写法:

c.SetCookie("auth_token", "", -1, "/", "example.com", true, true)

为什么不能用全局 map 模拟 Session 存 Cookie ID

Cookie 只是轻量凭证(比如 session_id=abc123),真正用户数据必须存在服务端 Session 中 —— Gin 本身不提供 Session 支持,gin.Default() 里没有中间件。

  • 自己用 map[string]interface{} + sync.Mutex?并发写入直接 panic,或锁粒度错导致数据竞争
  • 服务重启?所有 Session 全丢,用户强制登出
  • 部署多实例?A 实例生成的 Session ID,B 实例查不到,用户刷新就变未登录
  • 正确方案:用 github.com/gin-contrib/sessions + Redis,redis.NewStore() 接收的是 *redis.Client,不是地址字符串

Session ID 默认存名为 "session" 的 Cookie,HttpOnly=true 和 Secure=true 生产环境默认开启,改名要前后端同步,否则前端发不过来、后端读不到。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Go Web框架Gin接口开发与中间件设计实践
Go Web框架Gin接口开发与中间件设计实践

本专题围绕 Go 在 Web 后端开发中的主流框架 Gin 展开,系统讲解高性能接口开发与中间件机制设计。内容涵盖路由分组、请求绑定、参数校验、统一响应封装、日志与鉴权中间件实现,以及接口限流与异常处理策略。通过实战项目案例,帮助开发者构建结构清晰、性能优良的 Go Web 服务体系,提升接口开发效率与系统可维护性。

2026.03.19

337

21

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

0

20

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

2026.10.15

0

18

C++ 开发环境怎么搭建
C++ 开发环境怎么搭建

C++开发环境专题汇集Windows、Linux下的编译器与IDE安装配置教程,涵盖GCC、Clang、Visual Studio、CLion和VS Code,以及编译运行首个程序的步骤。

2026.10.15

0

19

Python 虚拟环境是什么
Python 虚拟环境是什么

Python虚拟环境专题介绍项目依赖隔离的作用,汇集venv与uv创建、激活、退出及解释器切换的相关文章,并覆盖Windows、Linux和VS Code中的常见配置问题。

2026.10.15

0

15

Python 怎么安装并配置环境变量
Python 怎么安装并配置环境变量

Python安装与环境变量配置专题汇集Windows、macOS和Linux的安装步骤、PATH设置、pip配置及常见报错排查文章,帮助完成解释器安装并验证命令行可以正常运行。

2026.10.15

0

15

PHP 连接 MySQL 失败怎么办
PHP 连接 MySQL 失败怎么办

PHP连接MySQL失败专题汇集PDO与MySQLi扩展配置、账号权限、主机端口、套接字和认证方式等排查文章,覆盖连接报错、密码变更与容器环境配置,帮助按错误提示定位原因并修复。

2026.10.15

0

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php注册登录系统开发实战
php注册登录系统开发实战

共10课时 | 13.8万人学习

PHP基于Cookie的购物车模块设计
PHP基于Cookie的购物车模块设计

共10课时 | 11.1万人学习

第三期培训_PHP开发
第三期培训_PHP开发

共116课时 | 32.6万人学习