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

Gin 中单一Cookie的应用


1 )路由处理

package routersimport ("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 webimport ("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) {// 获取 cookieusername, _ := 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) {// 删除 cookiec.SetCookie("username", "张三", -1, "/", "localhost", false, true) // 删除一个// 响应c.String(http.StatusOK, "delete cookie")
}
  • 设置cookie时,设置了两个不同过期时间的cookie

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

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

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

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

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

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

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

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

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

  • 所以,cookie的功能

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

    • https://gin-gonic.com/zh-cn/docs/examples/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 mainimport ("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 routersimport ("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 webimport ("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 mainimport ("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的删除和保存方法

其他

  • 关于多 session 和 其他存储引擎的 session 都在文档中
  • 参考:https://github.com/gin-contrib/sessions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十七届“挑战杯”广东大学生课外学术科技作品比赛感想

博主曾在2023年参加了第十七届“挑战杯”广东大学生课外学术科技作品比赛,也就是人们俗称的大挑,在团队赛里面含金量应该是排在第一档的了,当初我们有幸作为学校唯一一支科技创新B类进入到线下答辩,线下答辩就是区分银奖和金奖和特…

postgis应用笔记

1. postgis多边形查询相交LineString并切割相交范围内 table.shape 是postgis的Geometry的lineString 传入的参数shape是wkt格式的pologon select st_intersection(shape,st_geofromewkt(${shape})) from table where st_intersects(shape,st_geofromewkt(${shape}))2. 路牌坐…

恩智浦MCX A系列:开启工程师的无限创造潜力 | 百能云芯

恩智浦半导体(NXP)最近宣布推出旗下MCX产品组合中的全新成员——通用A系列的首批产品MCX A14x和MCX A15x,现已正式上市。这一系列的微控制器(MCU)不仅性价比高、使用便捷、体积小巧,而且还旨在为工程师们打…

分布式版本控制系统 Git

目录 一、Git简介 二、Git历史 三、安装git 1.准备环境 2.Yum安装Git 四、初次运行 Git 前的配置 命令集 实例: 五、Git命令常规操作 六、获取 Git 仓库(初始化仓库) 创建裸库 实例 : 创建本地库 一、Git简介 官网&…

美国硅谷服务器的优势有哪些

很多用户在选择服务器时会优先选择美国硅谷服务器,那么美国硅谷服务器,为什么会让人更加青睐,美国硅谷服务器为您整理发布美国硅谷服务器的优势有哪些。 美国硅谷服务器的优势主要体现在以下几个方面: 1. 性能卓越:硅…

opencv-python安装失败问题解决

用pip install opencv-python命令终端中出现如下报错: 解决方法,换一个源,输入: pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com运行之后即可安装成功:

【工具】Ubuntu开机黑屏、NVIDIA显卡驱动问题

重装显卡驱动导致开机黑屏 联想 P720 工作站,更新NVIDIA Quadro RTX5000 显卡驱动,重启后黑屏。 开机后待显示Lenovo后按下ESC, 进入Ubuntu 设置,按下E键,用箭头移动光标改参数 ro quiet splash $vt_handoff 改为 rw …

CAN Linux C应用编程

由于 Linux 系统将 CAN 设备作为网络设备进行管理,因此在 CAN 总线应用开发方面, Linux 提供了SocketCAN 应用编程接口,使得 CAN 总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。 SocketCAN 中大…

隐私保护 AI 的演变:从协议到实际实现

近些年,人工智能不断发展,在解决日常人类任务方面变得更加高效。但与此同时,它增加了个人信息滥用的可能性,在分析和传播个人数据方面达到了前所未有的力量和速度水平。在这篇文章中,我想仔细研究一下人工智能系统和机…

spinalhdl,vivado,fpga

https://spinalhdl.github.io/SpinalDoc-RTD/master spinal hdl sudo apt install openjdk-17-jdk scala curl echo “deb https://repo.scala-sbt.org/scalasbt/debian all main” | sudo tee /etc/apt/sources.list.d/sbt.list echo “deb https://repo.scala-sbt.org/scal…

浅谈加密算法(对称加密、非对称加密、混合加密、数字签名、哈希函数)

1、对称加密 对称加密只有一个密钥,直接使用这一个密钥对信息进行加密或解密。这样子就使得对称加密解密十分高效,计算量也相较于非对称加密小很多,适合有大量数据的场合。 密钥只有一个且他一定不能泄漏。由此分发密钥,讲这个密钥…

SQL 练习题目(入门级)

今天发现了一个练习SQL的网站--牛客网。里面题目挺多的,按照入门、简单、中等、困难进行了分类,可以直接在线输入SQL语句验证是否正确,并且提供了测试表的创建语句,也可以方便自己拓展练习,感觉还是很不错的一个网站&a…

ChromeDriver | 谷歌浏览器驱动下载地址 及 浏览器版本禁止更新

在使用selenoum时,需要chrome浏览器的版本和chrome浏览器驱动的版本一致匹配,才能进行自动化测试 一、ChromeDriver驱动镜像网址 国内可以搜到的谷歌浏览器下载地址里面最新的驱动器只有114版本的CNPM Binaries Mirror 在其他博主那找到了最新版本12X的…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现原理…

识别图片字符-PaddleOCR

PaddleOCR 是由百度开发的一个开源光学字符识别(OCR)工具,它可以识别图片中的文本信息。然而,PaddleOCR 本身主要专注于文本的检测与识别 安装PaddleOCR框架 pip install paddlepaddle paddleocr 使用PaddleOCR识别图片代码 fro…

STL - hash

1、unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是,进…

第四十一回 还道村受三卷天书 宋公明遇九天玄女-python创建临时文件和文件夹

宋江想回家请老父亲上山,晁盖说过几天带领山寨人马一起去。宋江还是坚持一个人去。 宋江到了宋家村,被两个都头和捕快们追捕,慌不择路,躲进了一所古庙。一会儿,听见有人说:小童奉娘娘法旨,请星主…

SpringBoot2整合支付宝进行沙箱支付

目录 1. 进入支付宝的开放平台 2. 导入Maven依赖 3. 配置application.yml文件 NATAPP.cn(内网穿透工具) 注册登录 下载 4. 后端配置 5. 测试 1. 进入支付宝的开放平台 开发平台: 支付宝开放平台 登录后,点击控制台 点击最下面的沙箱 2. 导入Maven依赖 <dependency…

频率主义线性回归和贝叶斯线性回归

整体概述 频率主义&#xff08;Frequentist&#xff09;线性回归和贝叶斯&#xff08;Bayesian&#xff09;线性回归是统计学中用于数据分析和预测的两种主要方法&#xff0c;特别是在建模关于因变量和自变量之间线性关系的上下文中。尽管两种方法都用于线性回归分析&#xff…

【LeetCode】746. 使用最小花费爬楼梯(简单)——代码随想录算法训练营Day38

题目链接&#xff1a;746. 使用最小花费爬楼梯 题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 …