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有上限;
相关推荐
祁许11 小时前
【Golang】GORM - GEN工具 快速开始
开发语言·golang
showyoui11 小时前
深入Go语言之slice:不只是动态数组
后端·golang·slice·切片
余厌厌厌12 小时前
Go迭代器完全指南:从基础到实战
开发语言·golang
C墨羽15 小时前
使用Gin框架构建高并发教练预约微服务:架构设计与实战解析
微服务·架构·golang·gin
亚洲第一中锋_哈达迪2 天前
详解缓存淘汰策略:LFU
后端·缓存·golang
nextera-void2 天前
深入浅出 Golang:一次精神之旅
开发语言·golang·go
痴人说梦梦中人2 天前
Gin框架统一响应与中间件机制学习笔记
网络安全·中间件·go·gin
胡萝卜的兔2 天前
golang -gorm 增删改查操作,事务操作
开发语言·后端·golang
Go Dgg2 天前
【Go + Gin 实现「双 Token」管理员登录】
开发语言·golang·gin
nbsaas-boot2 天前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang