当前位置: 首页 > news >正文

[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…...

中国高速公路行业市场规模及未来发展趋势

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

佳能iC MF645CX彩色激光多功能打印机报E302-0001故障码检修

故障现象: 一台佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码,如果设备未恢复,请联系经销商或客户支持中心。 维修分析: 佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码的...

加密越来越简单——用JavaScript实现数据加密和解密

加密越来越简单——用JavaScript实现数据加密和解密概念常用算法1. MD5加密算法2. SHA-1加密算法3. AES加密算法代码示例结论总结在当今互联网的世界中&#xff0c;安全性越来越受到关注&#xff0c;数据加密成为了必不可少的一环。Javascript作为前端开发的主要语言之一&#…...

线程池的使用场景

学习整理线程池的使用场景。...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...