在 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。如果获取成功,err
为nil
,并将 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了