gin框架02_cookie

在 Gin 中使用 Cookie 进行身份验证,设置和验证 Cookie

package main

import (
	"net/http"

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

func CookieTool() gin.HandlerFunc {
	return func(c *gin.Context) {
		// Get cookie
		if cookie, err := c.Cookie("label"); err == nil {
			if cookie == "ok" {
				c.Next()
				return
			}
		}

		// Cookie verification failed
		c.JSON(http.StatusForbidden, gin.H{"error": "Forbidden with no cookie"})
		c.Abort()
	}
}

func main() {
	route := gin.Default()

	route.GET("/login", func(c *gin.Context) {
		// Set cookie {"label": "ok" }, maxAge 30 seconds.
		c.SetCookie("label", "ok", 30, "/", "localhost", false, true)
		c.String(200, "Login success!")
	})

	route.GET("/home", CookieTool(), func(c *gin.Context) {
		c.JSON(200, gin.H{"data": "Your home page"})
	})

	route.Run(":8080")
}

1

func CookieTool() gin.HandlerFunc {
    return func(c *gin.Context) {
        // Get cookie
        if cookie, err := c.Cookie("label"); err == nil {
            if cookie == "ok" {
                c.Next()
                return
            }
        }

        // Cookie verification failed
        c.JSON(http.StatusForbidden, gin.H{"error": "Forbidden with no cookie"})
        c.Abort()
    }
}

中间件概念:中间件是在处理 HTTP 请求和响应过程中执行的函数,它可以对请求进行预处理,也可以对响应进行后处理。在 Gin 中,中间件函数的类型是gin.HandlerFunc

CookieTool函数:该函数返回一个gin.HandlerFunc类型的匿名函数,这个匿名函数就是实际的中间件逻辑。

在匿名函数内部:如果没有获取到 Cookie 或者 Cookie 的值不是ok,则调用c.JSON方法返回一个 HTTP 403 状态码的 JSON 响应,提示Forbidden with no cookie,并调用c.Abort()终止当前请求的处理流程如果获取到的 Cookie 值为ok,则调用c.Next()

c.Next()的作用是将请求传递给后续的处理函数继续处理。

c.Cookie("label"):从请求中获取名为label的 Cookie。如果获取成功,errnil,并将 Cookie 的值赋给cookie变量。

2

/login路由

  • c.String(200, "Login success!"):返回一个状态码为 200 的字符串响应,内容为Login success!
  • c.SetCookie("label", "ok", 30, "/", "localhost", false, true):设置一个名为label,值为ok的 Cookie。参数解释如下:
    • name:Cookie 的名称,这里是label
    • value:Cookie 的值,这里是ok
    • maxAge:Cookie 的最大有效期,单位为秒,这里设置为 30 秒。
    • path:Cookie 的有效路径,这里设置为/,表示整个网站都有效。
    • domain:Cookie 的有效域名,这里设置为localhost
    • secure:是否只在 HTTPS 连接中发送 Cookie,这里设置为false
    • httpOnly:是否只能通过 HTTP 协议访问 Cookie,这里设置为true
    • /home路由
      • CookieTool():将CookieTool中间件应用到该路由上,在处理该路由的请求时会先执行中间件的逻辑。
      • 如果中间件验证通过,则执行后续的匿名函数,调用c.JSON方法返回一个状态码为 200 的 JSON 响应,内容为{"data": "Your home page"}
  • route.Run(":8080"):启动 Gin 服务器,监听8080端口。

实际运行:

30s后确实no cookie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值