Gin框架: Cookie和Session在单体架构和分布式架构下的应用

12-Gin 中的 Session --[Gin 框架入门精讲与实战案例] Session(会话)是Web开发中的一个重要概念,用于在一段时间内跟踪用户的状态或活动。当用户与服务器进行交互时,如登录网站、添加商品到购物车等,服务器需要一种方式来记住这些操作,以便在整个访问期间保持用户的上下文信息。这就是Session的作用所在。 阅读详情

Gin 中单一Cookie的应用


1 )路由处理

package routers

import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)

func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setcookie", web.WebCtrl{}.SetCookie)
		webRouters.GET("/getcookie", web.WebCtrl{}.GetCookie)
		webRouters.GET("/delcookie", web.WebCtrl{}.DelCookie)
	}
}

2 ) 控制器处理

package web

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

type WebCtrl struct{}

// 设置 cookie
func (con WebCtrl) SetCookie(c *gin.Context) {
	// 设置 cookie
	// 第一个
	c.SetCookie("username", "张三", 3600, "/", "localhost", false, true)
	// 第二个
	c.SetCookie("hobby", "吃饭 睡觉", 5, "/", "localhost", false, true)
	// 响应
	c.String(http.StatusOK, "set cookie")
}

// 获取 cookie
func (con WebCtrl) GetCookie(c *gin.Context) {
	// 获取 cookie
	username, _ := c.Cookie("username")
	hobby, _ := c.Cookie("hobby")
	// 响应
	c.String(http.StatusOK, "username=%v----hobby=%v", username, hobby)
}

// 删除 cookie
func (con WebCtrl) DelCookie(c *gin.Context) {
	// 删除 cookie
	c.SetCookie("username", "张三", -1, "/", "localhost", false, true) // 删除一个
	// 响应
	c.String(http.StatusOK, "delete cookie")
}
  • 设置cookie时,设置了两个不同过期时间的cookie

  • 5s 后第一个cookie 自动丢失

  • 访问 /delcookie 路由,第二个路由被主动删除

  • HTTP 是无状态协议,当你浏览了一个页面

  • 然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站

  • 每一次的访问,都是没有任何关系的

  • 如果我们要实现多个页面之间共享数据的话

  • 我们就可以使用 Cookie 或者 Session 实现

  • cookie 是存储于访问者计算机的浏览器中

  • 可以让我们用同一个浏览器访问同一个域名的时候共享数据

  • 所以,cookie的功能

    • 保持用户登录状态
    • 保存用户浏览的历史记录
    • 猜你喜欢,智能推荐
    • 电商网站的加入购物车
  • cookie的文档

  • 设置cookie时的API

    • c.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
    • 第一个参数 key
    • 第二个参数 value
    • 第三个参数 过期时间
      • 如果只想设置 Cookie 的保存路径而不想设置存活时间
      • 可以在第三个参数中传递 nil
    • 第四个参数 cookie 的路径
    • 第五个参数 cookie 的路径 Domain 作用域
      • 本地调试配置成 localhost , 正式上线配置成域名
    • 第六个参数是 secure
      • 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
    • 第七个参数 httpOnly
      • 是微软对 COOKIE 做的扩展, 如果在 COOKIE 中设置了“httpOnly”属性
      • 则通过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生

多级域名共享 cookie

  • 不管二级或多级域名,可以设置根域名来共享数据
  • 分别把 a.xyz.com 和 b.xyz.com, 以及 c.b.xyz.com 解析到我们的服务器
  • 我们想的是用户在 a.xyz.com 中设置 Cookie 信息后
  • 在 b.xyz.com 以及 c.b.xyz.com 中获取刚才设置的cookie
  • 也就是实现多个二级域名共享 cookie,这时候就可以这样设置 cookie
  • c.SetCookie("usrename", "张三", 3600, "/", ".xyz.com", false, true)

单体架构 基于 cookie 存储 session


概述

1 ) 单单使用 cookie 的限制

  • 单单基于 cookie 的设定,只能读取单个客户端中的数据,不能做到数据在服务端共享
  • 服务端Cookie技术是将数据存储在用户的浏览器上,每次浏览器发送请求时
  • 都会携带这些Cookie数据发送到服务器。Cookie的大小通常受到限制
  • 大多数浏览器对单个Cookie的大小有4096字节的限制
  • 尽管现在一些新的浏览器和客户端设备支持更大的Cookie
  • 此外,用户可以选择禁用Cookie功能,这会影响Cookie的正常使用

2 )基于 cookie 的 session 技术

  • 与Cookie不同,Session技术将数据存储在服务器上
  • 这意味着Session没有存储大小的限制,只受限于服务器的内存大小
  • Session在用户访问期间一直存在在服务器上,直到会话结束或服务器决定删除它
  • 由于Session存储在服务器上,因此相比Cookie,它更安全,不容易被篡改
  • 但是,如果服务器上有大量的Session,会占用较多的服务器资源
  • 可能会影响服务器的性能

示例

1 )主程序配置 在 main.go 中

package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	// ... 跳过其他
	
	// 在路由配置之上,配置session中间件
	cookieSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥
	// 创建基于 cookie 的存储引擎
	store := cookie.NewStore([]byte(cookieSessionSecret))
	// 配置session的中间件 store是前面创建的存储引擎,我们可以替换成其他存储引擎
	r.Use(sessions.Sessions("xxproject_session", store))
	
	// ... 跳过其他
}

2 ) 路由配置

package routers

import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)

func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setsession", web.WebCtrl{}.SetSession)
		webRouters.GET("/getsession", web.WebCtrl{}.GetSession)
		webRouters.GET("/delsession", web.WebCtrl{}.DelSession)
	}
}

3 ) controller 控制器

package web

import (
	"net/http"
	"github.com/gin-contrib/sessions" // 则个是用于 直接获取 cookie 内容的
	"github.com/gin-gonic/gin"
)

type WebCtrl struct{}

// 设置 session
func (con WebCtrl) SetSession(c *gin.Context) {
	session := sessions.Default(c)
	// 配置session的过期时间
	session.Options(sessions.Options{
		// MaxAge: 3600 * 6, // 6hrs   MaxAge单位是秒
		MaxAge: 5, // 5 s 过期
	})
	session.Set("username", "张三 111")
	session.Save() // 设置session的时候必须调用
	// 响应
	c.String(http.StatusOK, "set session: %v", session.Get("username"))
}

// 获取 session
func (con WebCtrl) GetSession(c *gin.Context) {
	session := sessions.Default(c)
	username := session.Get("username")
	// 响应
	c.String(http.StatusOK, "get session username=%v", username)
}

// 删除 session
func (con WebCtrl) DelSession(c *gin.Context) {
	session := sessions.Default(c)
	session.Delete("username")
	session.Save() // 这将从 Cookie中 中删除 session 数据
	username := session.Get("username") // 获取 session username
	// 响应
	c.String(http.StatusOK, "delete session %v", username)
}
  • 基于cookie的 session 技术如上是基本使用程序
  • 需要注意的是,关于 session 删除同步到 cookie 删除是自动设置的
  • 调用 session 的 Delete 和 Save 方法来更新 Cookie
  • 由于 session 数据已经被删除,这个操作会创建一个新的、空的 Cookie
  • 这实际上会导致浏览器端的旧 Cookie 过期并被删除,所以无需我们控制cookie

分布式架构下 基于 redis 存储 session


概述

  • 如果项目部署在多台机器上,单体架构下的session无法共享,需要借助第三方来同步数据
  • 这时候就会用到 redis 或其他服务器存储技术,在负载均衡下的多台机器共享数据的场景
  • 就是分布式架构下的 session 应用场景

示例

1 )主程序 main.go

package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
)

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	// ... 跳过其他
	
	// 在路由配置之上,配置session中间件
	redisSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥
	// 配置session中间件
	
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte(redisSessionSecret))
	r.Use(sessions.Sessions("mysession", store))

	// ... 跳过其他
}

2 ) 路由和控制器同上面的 cookie based session 示例,这里不再赘述

3 )注意

  • 初始化基于 redis 的session存储引擎, 参数说明:
    • 第 1 个参数 - redis 最大的空闲连接数
    • 第 2 个参数 - 数通信协议 tcp 或者 udp
    • 第 3 个参数 - redis 地址, 格式,host:port
    • 第 4 个参数 - redis 密码
    • 第 5 个参数 - session 加密密钥
  • 同步删除 session 的时候,redis 的数据也会被同步删除,同时浏览器的Cookie数据也会同步消失
  • 有时候需要手动删除,比如客户端调用退出登录接口的时候,手动调用 session的删除和保存方法

其他

【Golang】关于Gin框架中的Cookie和Session 在深入探讨Cookie和Session之前,我们需要了解HTTP协议的无状态特性。简单来说,HTTP是一种无状态协议,即每次请求与响应之间都是独立的,服务器不会记住之前的状态信息。这意味着,当用户从一个页面跳转到另一个页面时,服务器无法自动识别这是同一个用户的请求。为了实现跨请求的数据共享,我们可以使用Cookie和Session。本文将结合实际案例,详细介绍在Go语言的Gin框架中如何使用Cookie和Session。 阅读详情

相关推荐

【Golang】Gin框架中如何使用JWT来实现登录认证

JWT: JSON Web Token,是一种用于身份验证和授权的开放标准,JWT可以在网络应用间安全的传输。JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature) JWT具有可扩展性、简单、轻量级、跨语言等优点,是前后端分离框架中最常用的验证方式。

景天科技苑 5万+

go语言web开发系列之二十九:gin框架用gin-contrib/sessions库管理session(基于cookie)

一,安装用到的库: 1,库的地址: https://github.com/gin-contrib/sessions 2,从命令行安装: liuhongdi@ku:~$ go get -u github.com/gin-contrib/sessions 说明:刘宏缔的go森林是一个专注golang的博客, 地址:https://blog.youkuaiyun.com/weixin_43881017 说明:作者:刘宏缔 邮箱: 371125307@qq.com 二,演示项目的相关信息 ...

刘老师的技术森林 2970

gin框架自带的一些的鉴定权限机制 session cookie

文章目录gin.Cookie() 使用gin.BasicAuth() 中间件github.com/gin-contrib/sessions 包实际生产中使用鉴权方式 gin.Cookie() 使用 下面的小例子可以使用 postman 来请求,只要服务启动了,其实主要就是 Cookie 函数来拿到请求头的 value,用 SetCookie 函数来设置 cookie 的 value func main() { r := gin.Default() r.Get("/cookie", handler.M

abcnull 的博客 3096

【Gin】Gin 当中使用 Cookie 和 Session

Gin 当中使用 Cookie 和 Session

徒挽的博客 1392

Go语言中的gin框架 Cookie和Session 操作手册 (十)

在Gin框架中,使用方法来设置Cookie、sessions 等本地存储工具。使用的session都是第三方包的使用。

A_LWIEUI_Learn的博客 2206

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2238

github.com/gin-contrib/sessions教程

开始 刚开始写session的时候,走了点“弯路”,自己跟着封装sessions的思路去封装了一个sessions包,其实可以直接用现成封装好的sessions包来使用sessions功能。 代码大纲: 准备工作 https://github.com/gin-contrib/sessions 同时需要依赖包 https://github.com/gorilla/sessions 其实当时报错缺...

我的技术栈碎碎念空间 7099

FPGA远程升级必备:STARTUPE2原语控制Flash的避坑指南

本文深入解析了FPGA远程升级中STARTUPE2原语的核心价值与配置策略,详细介绍了其在QSPI Flash接口设计中的应用。通过Vivado工具和原语控制,开发者可以高效实现安全可靠的远程固件升级,提升系统稳定性和升级效率。

k8l9m0n的博客 399

Gin 框架之Cookie与Session

Cookie是服务器保存在客户端浏览器之上的key-value键值对 :它是随着服务器的响应发送给客户端, 客户端将其保存, 下一次请求时会将Cookie放在其中, 服务器通过识别Cookie就能知道是哪个客户端浏览器存放在服务器上的键值对 :Cookie可以保存状态, 但本身最大只能支持4069字节, 并且不安全, 于是就出现了Session它能支持更多字节, 并且保存在服务端上, 具有较高的安全性,Session基于Cookie, 本地存放服务器返回给浏览器的随机字符串。

淘小欣的博客 2111

创建XCP的CanApe工程

创建XCP的CanApe工程

weixin_44173919的博客 2891

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

【Gin】2:快速上手Gin框架(模版、cookie、session)

【Gin】2:快速上手Gin框架(模版、cookie、session)

theaipower的博客 7188

c语言面试5(希诺麦田)

在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是。

Pierce110110的博客 1053

【Gin框架入门到精通系列08】Gin中的Cookie和Session管理

本文详细介绍了Gin框架中的Cookie和Session管理机制,包括基础概念、代码实践、安全最佳实践以及常见应用场景,帮助您构建安全可靠的用户认证和状态管理系统。

GopherTribe的博客 1061

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2624

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 437

Gin 中使用 Cookie,Session

HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie,Session或Token实 现cookie 是存储浏览器中的键值对,可以让我们用同一个浏览器访问同一个域名 的时候共享数据session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。

go|Python的个人博客 2084

【微服务】SpringBoot 整合 FastExcel 实现导入导出操作详解

SpringBoot 整合 FastExcel 实现导入导出操作详解

congge 4239

Gin- Cookie\Session相关

Gin- Cookie\Session相关

zyh_2021131030的博客 2188

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[golang gin框架] 5.Cookie以及Session

gin 使用cookie以及session

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 2311

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Go】-Gin框架

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。如果你是性能和高效的追求者, 你会爱上Gin。在Gin框架中,SetFuncMap方法用于为模板渲染设置自定义的函数映射。这允许你在模板中使用自定义的函数,这些函数可以执行复杂的逻辑或操作,从而增强模板的灵活性和功能。:这是一个映射,键是字符串(函数名),值是可调用的函数func。这些函数可以在模板中被调用。定义一个不转义相应内容的safe},})

knoci的博客 5421

go语言gin框架cookie和session

Cookie Cookie的由来 HTTP协议是无状态的,这就存在一个问题。 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。 Co

weixin_44865158的博客 2593

Gin框架中基于Redis的Session实现:优势、对比与应用实践

Session(会话)是Web开发中用于跟踪用户状态的一种服务器端机制。它通过在服务器端存储用户相关数据,并为客户端分配唯一标识符(通常通过Cookie传递),实现跨请求的用户状态维护。与直接将数据存储在客户端的Cookie不同,Session将敏感数据保留在服务器端,仅通过Session ID与客户端交互,从而提高了安全性。

Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程 1210

5-gin会话控制cookie和session

[toc] cookie是什么? http是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出 cookie就是解决http协议无状态的方案之一 Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求 c...

kismile 6334

Gin中的Cookie和Session的用法

cookie和session是 Web 开发中常用的两种技术,主要用于跟踪用户的状态信息。

JUIU9527的博客 838

【go-gin框架的登录认证实现】Session-Cookie认证及完整代码实现

认识Session—Cookie,通过代码实现,构建业务逻辑

birdand的博客 534
上一篇: Gin框架: 通用方法的封装与上传功能的应用
下一篇: Gin框架: 使用go-ini配置参数与不同环境下的配置部署
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值