gin | gin会话控制

会话控制

Cookie介绍

  • HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出;
  • Cookie 就是解决 HTTP 协议无状态的方案之一,中文是小甜饼的意思;
  • Cookie 实际上就是服务器保存在浏览器上的一段信息。浏览器有了 Cookie 之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求;
  • Cookie 由服务器创建,并发送给浏览器,最终由浏览器保存;
  • 测试服务端发送cookie给客户端,客户端请求时携带cookie;
  • 测试服务端发送 cookie 给客户端,客户端请求时携带 cookie
Go 复制代码
package main 

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

func main() {
    // 1. 创建路由
    // 默认使用了2个中间件Logger(), Recovery()
    r := gin.Default()
    
    // 服务端要给客户端cookie
    r.GET("cookie", func(c *gin.Context) {
        // 获取客户端是否携带cookie
        cookie, err := c.Cookie("key_cookie")
        
        if err != nil {
            cookie = "NotSet"
            // 给客户端设置cookie
            // maxAge int, 单位为秒
            // path, cookie 所在目录
            // domain string, 域名
            // secure 是否智能通过https访问
            // httpOnly bool 是否允许别人通过js获取自己的cookie
            c.SetCookie("key_cookie", "value_cookie", 60, "/", "localhost", false, true)
        }
        fmt.Print("cookie的值是:%s\n", cookie)
    })
    r.Run(":8000")
}

Cookie练习

  • 模拟实现权限验证中间件
    • 有2个路由,login和home;
    • login用于设置cookie;
    • home是访问查看信息的请求;
    • 在请求home之前,先跑中间件代码,检验是否存在cookie;
  • 访问home,会显示错误,因为权限校验未通过;
  • 然后访问登录的请求,登录并设置cookie
  • 再次访问 home,访问成功
Go 复制代码
package main

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

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() {
   // 1.创建路由
   r := gin.Default()
   r.GET("/login", func(c *gin.Context) {
      // 设置cookie
      c.SetCookie("abc", "123", 60, "/",
         "localhost", false, true)
      // 返回信息
      c.String(200, "Login success!")
   })
   r.GET("/home", AuthMiddleWare(), func(c *gin.Context) {
      c.JSON(200, gin.H{"data": "home"})
   })
   r.Run(":8000")
}

访问 /home 和 /login 进行测试。

  • 不安全,明文;
  • 增加带宽消耗;
  • 可以被禁用;
  • cookie有上限;
相关推荐
moxiaoran57535 小时前
Go语言结构体
开发语言·后端·golang
吴佳浩 Alben12 小时前
Gin 入门指南 Swagger aipfox集成
gin
Tony Bai12 小时前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
小徐Chao努力17 小时前
Go语言核心知识点底层原理教程【变量、类型与常量】
开发语言·后端·golang
锥锋骚年17 小时前
go语言异常处理方案
开发语言·后端·golang
moxiaoran575319 小时前
Go语言的map
开发语言·后端·golang
小信啊啊19 小时前
Go语言数组
开发语言·后端·golang
IT艺术家-rookie20 小时前
golang-- sync.WaitGroup 和 errgroup.Group 详解
开发语言·后端·golang
树下水月20 小时前
Go语言编码规范
开发语言·后端·golang
laozhoy120 小时前
深入理解Golang中的锁机制
开发语言·后端·golang