【Gin】Gin 当中使用 Cookie 和 Session


作者的 Gin 框架学习是根据 B站视频 Gin教程_Golang框架Gin入门实战教程 来学习的,对大地老师的评价不吹不捧,很喜欢其讲课风格,而且这个视频特别适合小白学习,强烈推荐。

Cookie

⭐️Cookie 介绍

HTTP 是无状态协议,即请求的时候,浏览器和服务器是连接的,但是请求结束之后,连接就断了,这样的无状态协议,可以减轻服务器的压力。每一次的访问,都是没有任何关系的。如果想要实现多个页面之间共享数据的话可以使用 Cookie 或者 Session 实现。

Cookie 是存储在访问者计算机的浏览器当中,可以让我们用同一个浏览器访问同一个域名的时候共享数据。

⭐️设置获取 Cookie

设置 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 脚本等)将无法读取到 Cookie 信息,防止 XSS 攻击产生

获取 Cookie

cookie,err := c.Cookie("name")
	r.GET("/setCookie", func(c *gin.Context) {
		c.SetCookie("username", "zhangsan", 3600, "/", "localhost", false, true)
		c.String(http.StatusOK, "setCookie")
	})
	r.GET("/getCookie", func(c *gin.Context) {
		cookie, err := c.Cookie("username")
		if err == nil {
			c.String(http.StatusOK, "Cookie="+cookie)
		}
	})
	r.GET("/deleteCookie", func(c *gin.Context) {
		c.SetCookie("username", "zhangsan", -1, "/", "localhost", false, false)
		c.String(200, "删除Cookie")
	})

Session

⭐️Session 介绍及工作流程

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。

当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个 Session 对象,生成一个类似于 key, value的键值对,然后将 value 保存到服务器,将key(cookie)返回到浏览器(客户端),浏览器下次访问时会携带 key(cookie),找到对应的 session(value)。

⭐️Gin 中使用 Session

Gin 官方并没有提供 Session 相关的文档,可以使用第三方的 Session 中间件来实现。

https://github.com/gin-contrib/sessions

⭐️基于 Cookie 存储 Session

1、安装 session 包

go get github.com/gin-contrib/sessions

2、基本的 session 用法

package main
import ( 
    "github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)
func main() {
    r := gin.Default()
    // 创建基于 cookie 的存储引擎,secret11111 参数是用于加密的密钥
    store := cookie.NewStore([]byte("secret11111"))
    // 设置 session 中间件,参数 mysession,指的是 session 的名字,也是 cookie 的名字
    // store 是前面创建的存储引擎,我们可以替换成其他存储引擎
    r.Use(sessions.Sessions("mysession", store))
    r.GET("/", func(c *gin.Context) {
        //初始化 session 对象
        session := sessions.Default(c)
        //设置过期时间
        session.Options(sessions.Options{
        MaxAge: 3600 * 6, // 6hrs
    	})
        //设置 Session
        session.Set("username", "张三")
        session.Save()
        c.JSON(200, gin.H{"msg": session.Get("username")})
    })
    r.GET("/user", func(c *gin.Context) {
        // 初始化 session 对象
        session := sessions.Default(c)
        // 通过 session.Get 读取 session 值
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })
    r.Run(":8000")
}

⭐️基于 Redis 存储 Session

如果想将 session 数据保存到 redis 当中,只要将 session 的存储引擎改成 redis 即可。

使用 redis 作为存储引擎的例子:

首先安装 redis 存储引擎的包:

go get github.com/gin-contrib/sessions/redis
package main
import ( 
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/redis"
    "github.com/gin-gonic/gin"
)
func main() {
    r := gin.Default()
    // 初始化基于 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.GET("/", func(c *gin.Context) {
        session := sessions.Default(c)
        session.Set("username", "李四")
        session.Save()
        c.JSON(200, gin.H{"username": session.Get("username")})
    })
    r.GET("/user", func(c *gin.Context) {
        // 初始化 session 对象
        session := sessions.Default(c)
        // 通过 session.Get 读取 session 值
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })
    r.Run(":8000")
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想了解在 Gin 框架中如何使用 GORM 吗? 首先,你需要在你的项目中导入 Gin 和 GORM 的依赖。在导入之后,你可以在你的代码中创建一个 GORM 的数据库实例,然后使用它来执行数据库的操作。 以下是一个示例代码片段,展示了如何在 Gin使用 GORM: ```go import ( "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { // 创建数据库连接 dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // 将数据库实例作为 Gin 的中间件 r := gin.Default() r.Use(func(c *gin.Context) { c.Set("db", db) c.Next() }) // 在路由处理函数中使用数据库 r.GET("/users", func(c *gin.Context) { var users []User result := db.Find(&users) if result.Error != nil { c.JSON(500, gin.H{"error": "failed to get users"}) return } c.JSON(200, users) }) // 启动 Gin 服务器 r.Run(":8080") } ``` 在上面的代码中,我们创建了一个 GORM 的数据库实例,并将其作为 Gin 的中间件,使得在路由处理函数中可以直接使用该数据库实例来进行数据库的操作。在示例代码中,我们定义了一个 `/users` 的路由,当接收到 GET 请求时,会使用 GORM 查询数据库中的所有用户,并将结果以 JSON 格式返回给客户端。 希望这个例子可以帮助你理解在 Gin 中如何使用 GORM。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值