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有上限;
相关推荐
Ai 编码助手5 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
轩辕烨瑾7 小时前
C#语言的区块链
开发语言·后端·golang
萧若岚9 小时前
Elixir语言的Web开发
开发语言·后端·golang
AI向前看10 小时前
PHP语言的软件工程
开发语言·后端·golang
Pandaconda11 小时前
【Golang 面试题】每日 3 题(四十一)
开发语言·经验分享·笔记·后端·面试·golang·go
哆啦A梦158811 小时前
Gin 框架入门实战系列教程
gin
Like_wen11 小时前
【Go面试】基础八股文篇 (持续整合)
java·后端·计算机网络·面试·golang·go·八股文
执念斩长河12 小时前
Go反射学习笔记
笔记·学习·golang
咩咩大主教12 小时前
Go语言通过Casbin配合MySQL和Gorm实现RBAC访问控制模型
mysql·golang·鉴权·go语言·rbac·abac·casbin
小小志爱学习12 小时前
提升 Go 开发效率的利器:calc_util 工具库
数据结构·算法·golang