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有上限;
相关推荐
每天一个秃顶小技巧3 分钟前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
恋喵大鲤鱼3 分钟前
Golang 空结构体特性与用法
golang·空结构体
q567315234 小时前
Go语言多线程爬虫与代理IP反爬
开发语言·爬虫·tcp/ip·golang
Chandler244 小时前
Go语言即时通讯系统 开发日志day1
开发语言·后端·golang
神奇侠20245 小时前
快速开发-基于gin的中间件web项目开发
中间件·gin
李匠20249 小时前
C++GO语言微服务基础技术②
开发语言·c++·微服务·golang
BUG制造机.9 小时前
Go 语言 slice(切片) 的使用
开发语言·后端·golang
Go Dgg11 小时前
Go语言实现豆瓣电影Top250爬虫
开发语言·爬虫·golang
你怎么知道我是队长20 小时前
Go语言标识符
后端·golang
烧瓶里的西瓜皮21 小时前
Go语言从零构建SQL数据库(9)-数据库优化器的双剑客
数据库·sql·golang