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有上限;
相关推荐
RationalDysaniaer13 小时前
Gin入门笔记
笔记·gin
qq_1728055913 小时前
GIN 反向代理功能
后端·golang·go
千年死缓13 小时前
gin中间件
中间件·gin
__AtYou__14 小时前
Golang | Leetcode Golang题解之第535题TinyURL的加密与解密
leetcode·golang·题解
kevin_tech18 小时前
Go API 多种响应的规范化处理和简化策略
开发语言·后端·golang·状态模式
幺零九零零21 小时前
【Golang】sql.Null* 类型使用(处理空值和零值)
数据库·sql·golang
cookies_s_s1 天前
Golang--DOS命令、变量、基本数据类型、标识符
golang
__AtYou__1 天前
Golang | Leetcode Golang题解之第541题反转字符串II
leetcode·golang·题解
flying robot1 天前
Go的JSON转化
golang
幺零九零零1 天前
【Golang】validator库的使用
开发语言·后端·golang