cookie的获取:
func (c *Context) Cookie(name string) (string, error)
Cookie 返回请求中提供的命名 cookie,如果未找到则返回 ErrNoCookie。并返回命名的 cookie 是未转义的。如果多个 cookie 与给定名称匹配,则只会返回一个 cookie。
cookie的设置:
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
SetCookie 将 Set-Cookie 标头添加到 ResponseWriter 的标头中。提供的 cookie 必须具有有效的名称。无效的 cookie 可能会被静默丢弃。
参数:
name
:cookie的名称
value
:cookie的值
maxAge int
:cookie存活时间,单位为秒
path
:cookie所在目录
domain string
:域名
secure
:是否只能通过https访问
httpOnly bool
:是否允许别人通过js获取自己的cookie
实例演示:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func Handler(c *gin.Context) {
// 获取cookie
s, err := c.Cookie("username")
if err != nil {
s = "Psych"
// 设置cookie
c.SetCookie("username", s, 60*60, "/", "localhost", false, true)
}
fmt.Printf("cookie的值为:%s\n", s)
c.String(200, "测试cookie")
}
func main() {
e := gin.Default()
e.GET("/test", Handler)
e.Run()
}
运行结果:
浏览器输入:localhost:8080/test
查看cookie
后台输出:
模拟实现权限验证中间件
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func Login(c *gin.Context) {
// 设置cookie
c.SetCookie("abc", "123", 60, "/",
"localhost", false, true)
// 返回信息
c.String(200, "Login success!")
}
func Home(c *gin.Context) {
c.JSON(200, gin.H{"data": "home"})
}
func AuthMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取客户端cookie并校验
if cookie, err := c.Cookie("abc"); err == nil {
if cookie == "123" {
c.Next()
return
}
}
// 返回错误
c.JSON(http.StatusUnauthorized, gin.H{"error": "err"})
// 若验证不通过,不再调用后续的函数处理
c.Abort()
return
}
}
func main() {
// 创建路由
r := gin.Default()
r.GET("/login", Login)
r.GET("/home", AuthMiddleWare(), Home)
r.Run()
}
浏览器输入:localhost:8080/login
页面显示为:
更改url为:localhost:8080/home
查看cookie: