[golang gin框架] 5.Cookie以及Session
1.Cookie
(1).介绍
HTTP 是无状态协议,简单地说,当浏览了一个页面,然后转到同一个网站的另一个页
面,服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问,都是没有任何
关系的,如果要实现多个页面之间共享数据的话就可以使用 Cookie 或者 Session 实
现
cookie 是存储于访问者计算机的浏览器中,可以用同一个浏览器访问同一个域名
的时候共享数据
(2).Cookie 能实现的功能
1).保持用户登录状态
2).保存用户浏览的历史记录
3).电商网站的加入购物车
...
(3).设置和获取 Cookie,多个二级域名共享 cookie
参考文档:https://gin-gonic.com/zh-cn/docs/examples/cookie/
参考文章:https://blog.csdn.net/zhoupenghui168/article/details/128885820
设置 Cookie
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
cookie, err := c.Cookie("name")
完整案例
package ityingimport ("github.com/gin-gonic/gin""net/http"
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置cookie//3600 表示 多少秒过期c.SetCookie("username", "李四", 3600, "/", "127.0.0.1", false, true)//多个二级域名共享 cookie//1、分别把 a.gin.com 和 b.gin.com 解析到我们的服务器//2、我们想的是用户在 a.gin.com 中设置 Cookie 信息后在 b.gin.com 中获取刚才设置的//cookie,也就是实现多个二级域名共享 cookie//这时候的话我们就可以这样设置 cookiec.SetCookie("username", "李四", 3600, "/", "*.gin.com", false, true)c.HTML(http.StatusOK, "default/index.html",gin.H{"msg":"我是一个msg","t": 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取cookieusername, _ := c.Cookie("username")c.String(http.StatusOK, "新闻--cookie.username=" +username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ := c.Cookie("username")c.String(http.StatusOK, "shop--cookie.username=" +username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie("username", "李四", -1, "/", "127.0.0.1", false, true)
}
2.Session
(1).介绍
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session
保存在服务器上
(2).Session 的工作流程
当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个 session 对象,生成
一个类似于 key,value 的键值对,然后将 value 保存到服务器 将 key(cookie)返回到浏览器(客
户)端,浏览器下次访问时会携带 key(cookie),找到对应的 session(value)
(3).Gin 中使用 Session
Gin 官方没有提供 Session 相关的文档,这个时候可以使用第三方的 Session 中间
件来实现:https://github.com/gin-contrib/sessions
gin-contrib/sessions 中间件支持的存储引擎:
• cookie
• memstore
• redis
• memcached
• mongodb
(4).基于 Cookie 存储 Session
1).安装 session 包:在main.go对应的目录下运行
go get github.com/gin-contrib/sessions
2).基本的 session 用法
main.go
package mainimport ("fmt""gindemo/models""gindemo/routers""github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie"_ "github.com/gin-contrib/sessions/cookie""github.com/gin-contrib/sessions/redis""github.com/gin-gonic/gin""html/template""os""path/filepath""strings""time"
)func main() {//初始化路由,会设置默认中间件:engine.Use(Logger(), Recovery()),可以使用gin.New()来设置路由r := gin.Default()//创建基于cookie的存储引擎,secret11111参数是用于加密的密钥store := cookie.NewStore([]byte("secret11111"))//设置session中间件,参数mysession,指的是session的名字,也是cookie的名字//store是前面创建的存储引擎,我们可以替换成其他存储引擎r.Use(sessions.Sessions("mysession", store))//定义模板函数,必须在r.LoadHTMLGlob前面r.SetFuncMap(template.FuncMap{"UnixToTime": models.UnixToTime, //注册模板函数"Println": Println,})//加载templates中所有模板文件, 使用不同目录下名称相同的模板,注意:一定要放在配置路由之前才得行//如果模板在多级目录里面的话需要这样配置 r.LoadHTMLGlob("templates/**/**/*") /** 表示目录//LoadHTMLGlob只能加载同一层级的文件//比如说使用router.LoadHTMLFile("/templates/**/*"),就只能加载/templates/admin/或者/templates/order/下面的文件//解决办法就是通过filepath.Walk来搜索/templates下的以.html结尾的文件,把这些html文件都加载一个数组中,然后用LoadHTMLFiles加载//r.LoadHTMLGlob("templates/**/*")var files []stringfilepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {if strings.HasSuffix(path, ".html") {files = append(files, path)}return nil})r.LoadHTMLFiles(files...)//配置静态web目录 第一个参数表示路由,第二个参数表示映射的目录r.Static("/static", "./static")//分组路由文件routers.AdminRoutersInit(r)routers.ApiRoutersInit(r)routers.DefaultRoutersInit(r)r.Run() // 启动一个web服务
}
控制器设置,获取session
package ityingimport ("github.com/gin-contrib/sessions""github.com/gin-gonic/gin""net/http"
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置sessionsession := sessions.Default(c)session.Set("username", "张1三")session.Save() // 设置session的时候必须调用c.HTML(http.StatusOK, "default/index.html",gin.H{"msg":"我是一个msg","t": 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取session//初始化session对象session:=sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge:3600*6,//6hrs})username := session.Get("username")c.String(http.StatusOK, "新闻--session.username=%v" , username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ := c.Cookie("username")c.String(http.StatusOK, "shop--cookie.username=" +username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie("username", "李四", -1, "/", "127.0.0.1", false, true)
}
(5).基于Redis 存储Session
如果想将 session 数据保存到 redis 中,只要将 session 的存储引擎改成 redis 即可
使用 redis 作为存储引擎,
首先安装 redis 存储引擎的包
1).安装 redis 存储引擎包:在main.go对应的目录下运行
go get github.com/gin-contrib/sessions/redis
2).案例
main.go
package mainimport ("fmt""gindemo/models""gindemo/routers""github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie"_ "github.com/gin-contrib/sessions/cookie""github.com/gin-contrib/sessions/redis""github.com/gin-gonic/gin""html/template""os""path/filepath""strings""time"
)func main() {//初始化路由,会设置默认中间件:engine.Use(Logger(), Recovery()),可以使用gin.New()来设置路由r := gin.Default()//初始化基于redis的存储引擎: 需要启动redis服务,不然会报错//参数说明://自第1个参数-redis最大的空闲连接数//第2个参数-数通信协议tcp或者udp//第3个参数-redis地址,格式,host:port 第4个参数-redis密码//第5个参数-session加密密钥store,_:=redis.NewStore(10,"tcp","localhost:6379","",[]byte("secret"))r.Use(sessions.Sessions("mysession",store))//定义模板函数,必须在r.LoadHTMLGlob前面r.SetFuncMap(template.FuncMap{"UnixToTime": models.UnixToTime, //注册模板函数"Println": Println,})//加载templates中所有模板文件, 使用不同目录下名称相同的模板,注意:一定要放在配置路由之前才得行//如果模板在多级目录里面的话需要这样配置 r.LoadHTMLGlob("templates/**/**/*") /** 表示目录//LoadHTMLGlob只能加载同一层级的文件//比如说使用router.LoadHTMLFile("/templates/**/*"),就只能加载/templates/admin/或者/templates/order/下面的文件//解决办法就是通过filepath.Walk来搜索/templates下的以.html结尾的文件,把这些html文件都加载一个数组中,然后用LoadHTMLFiles加载//r.LoadHTMLGlob("templates/**/*")var files []stringfilepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {if strings.HasSuffix(path, ".html") {files = append(files, path)}return nil})r.LoadHTMLFiles(files...)//配置静态web目录 第一个参数表示路由,第二个参数表示映射的目录r.Static("/static", "./static")//分组路由文件routers.AdminRoutersInit(r)routers.ApiRoutersInit(r)routers.DefaultRoutersInit(r)r.Run() // 启动一个web服务
}
控制器设置,获取session
package ityingimport ("github.com/gin-contrib/sessions""github.com/gin-gonic/gin""net/http"
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置sessionsession := sessions.Default(c)session.Set("username", "张1三")session.Save() // 设置session的时候必须调用c.HTML(http.StatusOK, "default/index.html",gin.H{"msg":"我是一个msg","t": 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取session//初始化session对象session:=sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge:3600*6,//6hrs})username := session.Get("username")c.String(http.StatusOK, "新闻--session.username=%v" , username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ := c.Cookie("username")c.String(http.StatusOK, "shop--cookie.username=" +username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie("username", "李四", -1, "/", "127.0.0.1", false, true)
}
注意:在使用redis储存session时,需要运行redis程序,不然会报错
[上一节][golang gin框架] 4.自定义Model以及Gin 文件上传
相关文章:
[golang gin框架] 5.Cookie以及Session
1.Cookie(1).介绍HTTP 是无状态协议,简单地说,当浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问,都是没有任何关系的,如果要实现多个页面之间共享数据的话就可以…...

【牛客刷题专栏】0x0B:JZ3 数组中重复的数字(C语言编程题)
前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…...

js中的隐式类型转换有哪些
目录一、隐式类型转换条件二、 的隐式类型转换三、 的隐式类型转换四、object 的隐式类型转换探讨 object 的隐式转换执行顺序探讨 Symbol.toPrimitive 属性如何将对象转换为原始值在前端js这门动态弱类型语言中,不仅存在着显示类型转换,还存在许多隐式类…...
WuThreat身份安全云-TVD每日漏洞情报-2023-02-17
漏洞名称:IBM Aspera Faspex 预身份验证 RCE 漏洞 漏洞级别:高危 漏洞编号:CVE-2022-47986 相关涉及:IBM Aspera Faspex 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-02805 漏洞名称:Kardex Mlog MCC PATH 遍历 漏洞级别:严重 漏洞编号:CVE…...
掌握MySQL分库分表(三)水平分库分表常见策略range、hash
文章目录range策略Range策略延伸基于Range范围分库分表业务场景hash取模案例规则水平分库分表,根据什么规则进行划分? range策略 自增id,根据ID范围进行分表(左闭右开) 规则案例: 1~1,000,000 是 table…...

CTFer成长之路之CTF中的SQL注入
CTF中的SQL注入CTF SQL注入 SQL注入-1 题目描述: 暂无 docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-sql-1:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{union_select_is_so_cool} Wri…...
python snap7读写PLC
主要在DB块里操作 读DB块 import snap7 import structdef plc_connection():PLC_IP 192.168.10.10PLC snap7.client.Client()PLC.connect(PLC_IP, rack0, slot1)return PLCPLC plc_connection()PLC.read_area()方法从PLC中读取指定区域的数据。 1200表示DB块的编号&#x…...

使用物联网进行智能能源管理的10大优势
如今,物联网推动了许多行业的自动化流程和运营效率,而物联网在能源领域的应用尤其受到消费者、企业甚至政府的关注。除了对电力供应链的诸多好处之外,物联网能源管理系统还让位于新的智能电网,并有望实现更高的安全性和效率。基于…...

工业4.0和工业物联网如何协同工作
虽然许多公司已经接受了工业物联网,但他们现在必须接受工业4.0对数据驱动的数字化转型的承诺。随着制造业、能源、公用事业和供应链应用迅速采用工业物联网(IIoT),这些行业的新现实正在形成。工业物联网提供了企业管理数千个活动部件所需的数据类型&…...

Python机器学习入门笔记(3)—— 线性回归
目录 线性回归 算法简述 LinearRegression() API SGDRegressor API LinearRegression() 和 SGDRegressor对比 过拟合与欠拟合 岭回归 应用场景 线性回归 算法简述 线性回归是一种基本的机器学习算法,它用于建立自变量和因变量之间的线性关系模型。它假设…...

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly
如果你想编写Java web应用程序,首先需要做出一个艰难的决定:选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说,应用程序服务器执行Java应用程序。在操作系统中启动它们,然后将应用程序部署到其中。将应用程序服…...

如何在SpringBoot项目上让接口返回数据脱敏,一个注解即可
1 背景需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作2 思路①要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去,定…...

python 之 海龟绘图(turtle)
注:从个人博客园移植而来 使用简介 python 2.6引入的一个简单的绘图工具,俗称为海龟绘图。3.x以上使用的话,可通过pip进行安装,命令为: pip/pip3 install turtle如果出现如下错误: 解决方式: …...

RT-Thread SPI使用教程
RT-Thread SPI 使用教程 实验环境使用的是正点原子的潘多拉开发板。 SPI从机设备使用的是BMP280温湿度大气压传感器。 使用RT-Thread Studio搭建基础功能。 1. 创建工程 使用RT-Thread Studio IDE创建芯片级的工程。创建完成后,可以直接编译下载进行测试。 2.…...
shiro使用——整合spring
shiro使用——整合spring 1. 引入相关配置 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.9.1</version></dependency>2. 自定义Realm类 继承AuthorizingRealm 并重写相…...
2023-02-20 leetcode-AccountsMerge
摘要: 记录对leetcode-AccountsMerge的反思 要求: Given a list accounts, each element accounts[i] is a list of strings, where the first element accounts[i][0] is a name, and the rest of the elements are emails representing emails of the account. * Now, w…...

中国高速公路行业市场规模及未来发展趋势
中国高速公路行业市场规模及未来发展趋势编辑中国高速公路行业市场规模正在迅速增长。随着中国经济的快速发展和城市化的加速,对交通基础设施的需求也在不断增加。高速公路是最有效的交通工具,可以大大缩短交通时间,提高出行效率。因此&#…...

佳能iC MF645CX彩色激光多功能打印机报E302-0001故障码检修
故障现象: 一台佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码,如果设备未恢复,请联系经销商或客户支持中心。 维修分析: 佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码的...
加密越来越简单——用JavaScript实现数据加密和解密
加密越来越简单——用JavaScript实现数据加密和解密概念常用算法1. MD5加密算法2. SHA-1加密算法3. AES加密算法代码示例结论总结在当今互联网的世界中,安全性越来越受到关注,数据加密成为了必不可少的一环。Javascript作为前端开发的主要语言之一&#…...
线程池的使用场景
学习整理线程池的使用场景。...
前端开发三剑客:HTML5+CSS3+ES6
在前端开发领域,HTML、CSS和JavaScript构成了构建网页与Web应用的核心基础。随着技术标准的不断演进,HTML5、CSS3以及ES6(ECMAScript 2015及后续版本)带来了诸多新特性与语法优化,极大地提升了开发效率和用户体验。本文…...

行为设计模式之Command (命令)
行为设计模式之Command (命令) 前言: 需要发出请求的对象(调用者)和接收并执行请求的对象(执行者)之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象,这个Command对…...

Codeforces Round 1025 (Div. 2) B. Slice to Survive
Codeforces Round 1025 (Div. 2) B. Slice to Survive 题目 Duelists Mouf and Fouad enter the arena, which is an n m n \times m nm grid! Fouad’s monster starts at cell ( a , b ) (a, b) (a,b), where rows are numbered 1 1 1 to n n n and columns 1 1 1 t…...
day46 python预训练模型补充
目录 一、预训练模型的背景知识 二、实验过程 (一)实验环境与数据准备 (二)预训练模型的选择与适配 (三)训练策略 三、实验结果与分析 四、学习总结与展望 一、预训练模型的背景知识 在传统的神经网…...
C#提取CAN ASC文件时间戳:实现与性能优化
C#提取CAN ASC文件时间戳:实现与性能优化 在汽车电子和工业控制领域,CAN总线是最常用的通信协议之一。而ASC(ASCII)文件作为CAN总线数据的标准日志格式,广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…...
NoSQL 之 Redis 配置与优化
目录 一、 前置知识点 1. 关系数据库与非关系型数据库 (1)关系型数据库 (2)非关系型数据库 (3)非关系型数据库产生背景 (4)两者对比 2. Redis 基础 (1࿰…...
计算矩阵A和B的乘积
根据矩阵乘法规则,编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写,函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…...
东芝Toshiba e-STUDIO2110AC打印机信息
基本信息 产品类型:数码复合机颜色类型:彩色涵盖功能:复印、打印、扫描接口类型:标配为 Ethernet(RJ45)10/100/1000BASE - T、USB2.0 高速;选配为 Wireless Lan、IEEE802.11b/g/n、blueteeth。中…...
AI API、AI 聊天助手,两大服务助力应用智能化转型
网络效应、转换成本——这些一度定义了我们这个时代商业逻辑的规则,在 AI 时代迅速崩塌。创新性功能被无差别克隆包围,差异化优势在底层能力翻新中消散…… 更别说那些决策迟缓、行动无法言出法随的“后来者”,注定与市场窗口擦身而过。唯快…...

一站式直播工具:助力内容创作者高效开启直播新时代
近年来,随着互联网技术的不断进步和短视频、直播行业的爆发式增长,越来越多的企业和个人投入到直播电商、互动娱乐、在线教育等场景。直播运营过程中,涉及到数据统计、弹幕互动、流程自动化、内容同步等诸多环节。如何提升运营效率、减少人工…...