Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 中的 Cookie 和 Session

Go 中的 Cookie 和 Session

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

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

1. 准备

代码语言:go
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Gin 框架之Cookie与Session
早期(十几年前)的网页是静态的, 数据都是写死的, 人们访问网页只是用来查看新闻的, 没有保存用户状态的需求。
贾维斯Echo
2024/01/19
3560
Gin 框架之Cookie与Session
Go:优化分层架构数据传递,数据转换方法解析
在使用 Go 语言开发 Web 应用时,如何在分层架构中有效管理数据流转是一个值得深入探讨的问题。本文将通过一个基于 Gin 框架的示例,详细讲解如何在不同的软件层间进行数据转换,以提高代码的可维护性和可扩展性。
运维开发王义杰
2024/05/10
2040
Go:优化分层架构数据传递,数据转换方法解析
漏洞挖掘之从开发者视角解析Gin框架中的逻辑漏洞与越权问题
以go的gin后端框架为例子,详细剖析了各种逻辑越权漏洞的成因已经对应防范手段,也为白帽子提供挖掘思路
亿人安全
2025/04/03
1670
漏洞挖掘之从开发者视角解析Gin框架中的逻辑漏洞与越权问题
Fabric区块链浏览器(2):用户认证
在上一篇文章[1]介绍如何解析区块数据时,使用session对客户端上传的pb文件进行区分,到期后自动删除。
孟斯特
2023/10/16
2340
Fabric区块链浏览器(2):用户认证
03 . Go框架之Gin框架从入门到熟悉(Cookie和Session,数据库操作)
Cookie Cookie是什么 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出 Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思 Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求 Cookie由服务器创建,并发送给浏览器,最终由浏览器保存 Cookie的用途 保持用户登录状态 Cookie
iginkgo18
2020/11/04
1.5K0
基于gin的golang web开发:实现用户登录
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件。本文将使用这两个包来实现一个简单的用户登录功能。
huofo
2022/03/18
1.6K0
Golang 单元测试 - 接口层
上次我们已经搞定了逻辑层的单元测试,这次我们来康康接口层的单元测试。接口层主要负责的就是请求的处理,最常见的就是 HTTP 请求的处理。
LinkinStar
2023/02/24
4190
Go 单元测试之HTTP请求与API测试
假设我们的业务逻辑是搭建一个http server端,对外提供HTTP服务。用来处理用户登录请求,用户需要输入邮箱,密码。
贾维斯Echo
2024/04/18
4540
Go 单元测试之HTTP请求与API测试
Go 标准库之 GoRequests 介绍与基本使用
Python中的Requests库非常强大,所以Go开发者模仿Python的Requests库,由此诞生了Grequests库。Grequests提供了一系列便利功能,使得发送HTTP请求变得简单高效。下面就是Grequests在Golang中实现的一些关键特性:
贾维斯Echo
2024/04/16
6600
gin框架之jwt
JWT (JSON Web Token) 是一种规范。这个规范允许我们使用JWT在用户和服务器之间安全传递信息.jwt分3个部分,Header 头部、Payload 载荷、Signature 签名, 用 dot(.) 点分开。想要具体理解jwt的童鞋可以自行百度,这里就不再赘述。
大话swift
2020/03/12
1.2K0
Go语言WEB框架之Gin
文档:https://gin-gonic.com/zh-cn/docs/quickstart/
码客说
2022/10/05
1.3K0
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了。
KevinYan
2023/01/03
3.4K0
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
在gin框架中使用JWT
JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。
luckpunk
2023/09/10
5520
boss: 这小子还不会使用validator库进行数据校验,开了~~~
哈喽,大家好,我是asong。这是我的第十篇原创文章。这周在公司做项目,在做API部分开发时,需要对请求参数的校验,防止用户的恶意请求。例如日期格式,用户年龄,性别等必须是正常的值,不能随意设置。最开始在做这一部分的时候,我采用老方法,自己编写参数检验方法,统一进行参数验证。后来在同事CR的时候,说GIN有更好的参数检验方法,gin框架使用github.com/go-playground/validator进行参数校验,我们只需要在定义结构体时使用binding或validatetag标识相关校验规则,就可以进行参数校验了,很方便。相信也有很多小伙伴不知道这个功能,今天就来介绍一下这部分。
Golang梦工厂
2022/07/07
7760
「Go工具箱」web中的session管理,推荐使用gorilla/sessions包
大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。同时了解其底层的实现原理,以便更深入地了解Go语言。
Go学堂
2023/01/31
7500
gin中validator模块的源码分析
众所周知,在api层需要使用gin.Context中的ShouldBindJSON方法来对request中的json字段进行校验,例子如下:
编程黑洞
2023/03/06
4260
优化gin表单的错误提示信息
创建一个简单的登录例子,我们对username和password绑定了required标签,代表着请求login接口的参数中必须包含这两个字段。
编程黑洞
2023/03/06
1.1K0
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.4K0
Gin-Web-Framework官方指南中文(下篇)
从零开发区块链应用(七)--gin框架参数获取
本文作者:杰哥的技术杂货铺[1] 一、获取 query 参数 query 指的是 URL ? 后面携带的参数,例如 user/info?username=张三&password=123。获取请求的 q
Tiny熊
2022/02/22
1.1K0
从零开发区块链应用(七)--gin框架参数获取
Gin 应用多实例部署session问题、session参数与刷新
其实Gin 中的session 是通过github.com/gorilla/sessions实现的,只不过做了二次封装。
贾维斯Echo
2024/01/28
3090
Gin 应用多实例部署session问题、session参数与刷新
相关推荐
Gin 框架之Cookie与Session
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档