Gin框架中Session与Cookie的读写操作

夜伟姑娘_3605

夜伟姑娘_3605

2026-09-02

840人浏览

原创

必须用 c.Cookie() 和 c.SetCookie() 操作 Cookie,手动设置易漏 HttpOnly 导致 XSS;Session 需用 gin-contrib/sessions,避免内存模拟缺陷;Cookie 存轻量标志,Session 存敏感数据,二者协同使用更安全。

gin框架中session与cookie的读写操作

Cookie 读写必须用 c.Cookie() 和 c.SetCookie()

直接操作 HTTP 头或自己拼 Set-Cookie 字符串会出问题:Gin 的 c.SetCookie() 内部做了 URL 编码、Secure/HttpOnly 标志处理、过期时间标准化,手动设置容易漏掉 HttpOnly=true 导致 XSS 风险,或传错 maxAge 类型(必须是 int,不是字符串或 time.Duration)。

读取时 c.Cookie("name") 返回的是解码后的原始值;如果 Cookie 值含特殊字符(如空格、中文),服务端写入时已自动编码,读取时无需再 url.QueryUnescape —— Gin 已帮你做完。

  • maxAge = -1 表示立即删除 Cookie(浏览器收到后清空)
  • maxAge = 0 表示忽略 Max-Age 字段,退化为会话级 Cookie(关浏览器即失效)
  • 开发时 domain 设为 "localhost";上线必须改成实际域名,且不能带端口("example.com:8080" 无效)
  • secure = true 时,HTTP 请求无法携带该 Cookie,只在 HTTPS 下生效 —— 本地调试若没配 HTTPS,务必设为 false

Session 不是 Gin 内置功能,必须用 gin-contrib/sessions

Gin 本身不提供 Session 管理,gin.Default() 里没有 Session 中间件。强行自己用 map + mutex 模拟内存 Session,会遇到并发读写 panic、重启丢失、多实例不共享三大硬伤。

标准做法是引入 github.com/gin-contrib/sessions,它封装了存储后端抽象,支持内存、Redis、PostgreSQL 等。最常用的是 Redis 方案:

  • 初始化时需传入 Redis 客户端(redis.NewStore(…)),不是字符串地址
  • Session key 名默认是 session,可通过 sessions.NewCookieStore(…).Options(sessions.Options{…}) 修改,但改完前后端必须一致
  • 调用 session.Get("user_id") 返回的是 interface{},需要类型断言,比如 v, ok := session.Get("user_id").(int64)
  • 修改 Session 后必须显式调用 session.Save(),否则变更不会写入后端 —— 这点极易遗漏,导致“存了但下次读不到”

Session ID 存在哪?默认走 Cookie,别试图改存储位置

Session ID 总是通过 Cookie 传递,这是 HTTP 协议约束决定的。你不能把 Session ID 放 query string 或 header 里替代 Cookie —— 除非自己重写整个 Session 中间件(代价远高于收益)。

Session Handoff
Session Handoff

创建全面的交接文档,使新AI代理能够无缝继续工作,消除歧义。解决上下文耗尽问题。 时机:(1)用户请求保存交接,(2)上下文即将满,(3)主要任务完成,(4)会话结束,(5)恢复工作时。 关键词:保存状态、创建交接、上下文已满、暂停、从...恢复、加载交接、保存进度、会话转移、交接

下载

gin-contrib/sessions 默认使用名为 session 的 Cookie 存储 ID,并自动设置 HttpOnly=true、Secure=true(生产环境)、SameSite=Lax。这些安全选项不能关闭,否则可能被 CSRF 或 XSS 利用。

  • 前端 JS 无法读取该 Cookie(HttpOnly 生效),所以登录态对前端透明,只能靠接口返回状态判断
  • 跨域请求时,若前端发 credentials: 'include',后端必须设置 c.Header("Access-Control-Allow-Origin", "https://your-frontend.com"),不能用 *
  • Cookie 的 Path 默认是 "/",确保所有路由都能携带;改窄了(比如 "/api")会导致登录页(/login)无法写入 Session

Cookie 和 Session 混用时的典型陷阱

常见错误是把用户敏感数据(如密码哈希、token)直接塞进 Cookie,或把 Session 当长期存储用。两者定位完全不同:Cookie 是客户端轻量凭证载体,Session 是服务端有状态会话容器。

  • Cookie 值不要超过 4KB,否则部分浏览器截断;Session 数据无此限制(取决于后端存储)
  • 用 Cookie 存 “是否已登录” 标志(如 logged_in=true)+ Session 存用户 ID,比只用 Cookie 更安全 —— 前者可快速拒绝未登录请求,后者防伪造
  • Session 过期时间由后端控制(Redis TTL 或内存定时清理),Cookie 的 maxAge 只影响客户端何时删掉 Session ID,两者要对齐,否则出现“Cookie 没过期但 Session 已销毁”
  • 调用 c.Redirect() 后,若没在重定向前 session.Save(),新页面将读不到刚写入的 Session —— 因为重定向响应发出后,中间件链已终止

Session ID 的生成、校验、续期逻辑全由中间件托管,别在 handler 里手动解析 Cookie 或查 Redis —— 违反抽象层,后续换存储方案就得重写业务代码。

相关文章

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

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

下载

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

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

12159

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

1206

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

824

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1926

14

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1926

14

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

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

2026.03.19

337

21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方 app.conf 文档
Revel 官方 app.conf 文档

共0课时 | 0人学习

php注册登录系统开发实战
php注册登录系统开发实战

共10课时 | 13.8万人学习