Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Gin框架Cookie和Session的使用

关于Gin框架中的Cookie和Session的使用方法

作者:景天科技苑

为了实现跨请求的数据共享,我们可以使用Cookie和Session,本文将结合实际案例,详细介绍在Go语言的Gin框架中如何使用Cookie和Session,并通过代码示例介绍的非常详细,需要的朋友可以参考下

引言

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

一、Cookie的详细用法

1. Cookie的基本概念

Cookie是一种存储在客户端浏览器中的键值对数据,用于在客户端和服务器之间传递信息。每次向服务器发送请求时,浏览器都会自动携带这些Cookie信息。

2. 设置Cookie

在Gin框架中,可以通过c.SetCookie方法设置Cookie。以下是该方法的主要参数:

示例代码:

package main

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

func TestHandler(c *gin.Context) {
    // 获取客户端是否携带Cookie 获取名为"username"的Cookie
    // 如果不存在将myCookie设为lucas
    mycookie, err := c.Cookie("username")
    if err != nil {
        mycookie = "lucas"
    }
    // 给客户端设置Cookie
    // func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
    c.SetCookie("username", mycookie, 60*60, "/", "localhost", false, true)
    //响应客户端字符串
    c.String(200, "测试Cookie")
}

func main() {
    r := gin.Default() // 创建路由,默认使用Logger()和Recovery()中间件
    // func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes
    r.GET("/cookie", TestHandler)
    r.Run(":8888")
}

可以看到服务端给浏览器客户端设置的cookie

在这里插入图片描述

3. 获取cookie

要获取客户端请求中的Cookie,可以使用c.Cookie()方法。以下是一个示例:

package main

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

func getCookie(c *gin.Context) {
    // 获取名为"username"的Cookie
    cookie, err := c.Cookie("username")
    if err != nil {
        c.String(http.StatusOK, "未找到Cookie")
        return
    }
    c.String(http.StatusOK, "Cookie值:"+cookie)
}

func main() {
    r := gin.Default()
    r.GET("/getCookie", getCookie)
    r.Run(":8080")
}

由于我们设置了一条cookie,username为lucas,所以能获取到

在这里插入图片描述

4. 删除Cookie

删除Cookie实际上是通过设置其过期时间为负数来实现的。

package main

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

func deleteCookie(c *gin.Context) {
    // 删除名为"username"的Cookie
    //实际上就是设置maxAge为负数
    c.SetCookie("username", "", -1, "/", "localhost", false, true)
    c.String(http.StatusOK, "删除Cookie成功")
}

func main() {
    r := gin.Default()
    //在请求处,将handlers函数传进来
    r.GET("/deleteCookie", deleteCookie)
    r.Run(":8080")
}

在上面的代码中,c.SetCookie(“username”, “”, -1, “/”, “localhost”, false, true)方法会将名为"username"的Cookie过期时间设置为过去的时间戳,从而删除该Cookie。

二、Session的详细用法

1. Session的基本概念

Session是一种记录客户状态的机制,与Cookie不同的是,Session数据保存在服务器上。当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个Session对象,生成一个类似于key-value的键值对,然后将value保存到服务器,将key(通常是一个Cookie)返回到浏览器(客户端)。浏览器下次访问时会携带这个key,服务器通过这个key找到对应的Session数据。

在这里插入图片描述

2. Session的工作原理

3. Sesison的应用场景

第一次登录,服务器给客户端颁发一个唯一的sessionId, 并通过http的响应头返回。客户端(浏览器)发现返回的数据中有cookie数据就把这个cookie数据存放到内存。下次再发送http请求时,把内存中的cookie数据再塞到http请求头中,一并发给服务器,服务器在解析请求时,发现请求头中有cookie,就开始识别cookie中的sessionId,拿到sessionId,我们就知道这个请求时由哪个客户端发送来的了。

4. 在Gin框架中使用Session

Gin框架本身并不内置对Session的支持,但可以使用第三方的Session中间件来实现。其中比较常用的是github.com/gin-contrib/sessions。

1. 安装依赖

首先,需要安装Session中间件:

go get github.com/gin-contrib/sessions

在这里插入图片描述

2. 创建基于内存的Session

Session存储引擎有多种实现方式,如基于内存、Redis、MongoDB等。以下是一个基于内存的示例:

package main

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

func main() {
    r := gin.Default()
    // 创建基于内存的存储引擎
    // func NewStore(keyPairs ...[]byte) Store
    store := memstore.NewStore([]byte("secret11111"))
    // 设置Session中间件
    // func Sessions(name string, store Store) gin.HandlerFunc
    r.Use(sessions.Sessions("mysession", store))

    r.GET("/", func(c *gin.Context) {
        // 初始化Session对象
        session := sessions.Default(c)
        // 设置Session数据
        session.Set("username", "zhangsan")
        // 保存Session数据
        session.Save()
        c.JSON(200, gin.H{"message": "Session设置成功"})
    })

    r.GET("/get", func(c *gin.Context) {
        // 初始化Session对象
        session := sessions.Default(c)
        // 获取Session数据
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })

    r.Run(":8080")
}

在上面的代码中,memstore.NewStore([]byte(“secret11111”))创建了一个基于内存的Session存储引擎,sessions.Sessions(“mysession”, store)设置了Session中间件,其中"mysession"是Session的名称,也是Cookie的名称。

当我们访问首页,设置session成功

在这里插入图片描述

当我们访问/get,可以获取session

在这里插入图片描述

在控制器中使用Session
在Gin框架的控制器中,可以使用sessions.Default©方法获取当前的Session对象,然后调用Set、Get和Save等方法来设置、获取和保存Session数据。

3. 创建基于Redis存储Session

如果希望将Session数据保存在Redis中,可以使用github.com/gin-contrib/sessions/redis包。以下是一个示例:
首先,安装Redis存储引擎的包:

go get -u github.com/gin-contrib/sessions/redis

然后,配置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的存储引擎
    // func NewStore(size int, network, address, password string, keyPairs ...[]byte) (Store, error)
    // func NewStoreWithDB(size int, network, address, password, DB string, keyPairs ...[]byte) (Store, error) 指定DB
    store, _ := redis.NewStoreWithDB(10, "tcp", "10.10.0.100:6379", "123456", "0", []byte("secret"))
    // 设置Session中间件
    r.Use(sessions.Sessions("mysession", store))

    r.GET("/", func(c *gin.Context) {
        // 初始化Session对象
        session := sessions.Default(c)
        // 设置Session数据
        session.Set("username", "jingtian")
        // 保存Session数据
        session.Save()
        c.JSON(200, gin.H{"message": "Session设置成功"})
    })

    r.GET("/get", func(c *gin.Context) {
        // 初始化Session对象
        session := sessions.Default(c)
        // 获取Session数据
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })

    r.Run(":8080")
}

浏览器访问首页,session保存成功

在这里插入图片描述

登录redis查看,可以看到session

在这里插入图片描述

5. Session的基本操作

在获取到Session对象后,我们可以对其进行设置、获取、删除和清除等操作。需要注意的是,每次对Session进行修改后,都需要调用session.Save()方法来保存更改。

设置Session:

session.Set("username", "zhangsan")  
session.Save()

获取Session:

username := session.Get("username")

删除Session中的某个键值对:

session.Delete("username")  
session.Save()

清除整个Session:

session.Clear()  
session.Save()

三、注意事项

四、总结

本文详细介绍了在Go语言的Gin框架中如何使用Cookie和Session来实现跨请求的数据共享。通过合理配置和使用这些机制,我们可以有效地管理客户端状态,提高应用程序的可用性和安全性。

以上就是关于Gin框架中的Cookie和Session的使用方法的详细内容,更多关于Gin框架Cookie和Session的使用的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文