前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Go 中的 Cookie 和 Session

Go 中的 Cookie 和 Session

原创
作者头像
浩瀚星河
修改2025-03-25 11:05:06
修改2025-03-25 11:05:06
490
举报
文章被收录于专栏:golanggolang

今天聊聊 Cookie 和 Session 的登录认证怎么搞,以及能用在哪。

1. 准备

代码语言:go
复制
var sessionStore sync.Map
type User struct {
    Name     string `json:"name" binding:"required"`
    Password string `json:"password" binding:"required"`
}
  • sync.Map 存 Session,线程安全。
  • User 定义用户名和密码,必填。

2. 生成 Session ID

代码语言:go
复制
func generateSessionID(user User) (string, error) {
    sessionID := uuid.NewString()
    userData, _ := json.Marshal(user)
    sessionStore.Store(sessionID, userData)
    return sessionID, nil
}
  • uuid 生成随机 ID,用户信息转 JSON 存起来。

3. 查 Session

代码语言:go
复制
func getUserFromSession(sessionID string) (*User, bool) {
    if data, ok := sessionStore.Load(sessionID); ok {
        var user User
        json.Unmarshal(data.([]byte), &user)
        return &user, true
    }
    return nil, false
}
  • 用 Session ID 查数据,反序列化成 User

4. 登录逻辑

代码语言:go
复制
func loginHandler(ctx *gin.Context) {
    var user User
    if ctx.ShouldBindJSON(&user) != nil {
        ctx.JSON(400, gin.H{"error": "bad request"})
        return
    }
    if sessionID, _ := ctx.Cookie("auth"); sessionID != "" {
        if cachedUser, found := getUserFromSession(sessionID); found {
            ctx.JSON(200, cachedUser)
            return
        }
    }
    sessionID, _ := generateSessionID(user)
    ctx.SetCookie("auth", sessionID, 3600, "/", "localhost", false, false)
    ctx.JSON(200, gin.H{"message": "登录成功"})
}
  • 校验请求,Cookie 命中返回用户信息,没命中生成新 Session ID,设 Cookie。

原理

Cookie 携带 Session ID,服务器通过 ID 查询 Redis 缓存,若命中则返回用户信息,否则生成新会话并缓存后返回客户端。

局限

Cookie 未加密,多机不共享。

改进

  • Redis 存 Session。
  • Cookie 加安全标志。

总结

小项目好使,大规模用token,更安全

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准备
  • 2. 生成 Session ID
  • 3. 查 Session
  • 4. 登录逻辑
  • 原理
  • 局限
  • 改进
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档