• Go Web——Gin使用cookies



    Cookie介绍

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

    Cookie的使用

    • cookie的获取

      func (c *Context) Cookie(name string) (string, error)
      
      • 1

      Cookie 返回请求中提供的命名 cookie,如果未找到则返回 ErrNoCookie。并返回命名的 cookie 是未转义的。如果多个 cookie 与给定名称匹配,则只会返回一个 cookie。

    • cookie的设置

      func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
      
      • 1

      SetCookie 将 Set-Cookie 标头添加到 ResponseWriter 的标头中。提供的 cookie 必须具有有效的名称。无效的 cookie 可能会被静默丢弃。

      参数:

      • name:cookie的名称

      • value:cookie的值

      • maxAge int:cookie存活时间,单位为秒

      • path:cookie所在目录

      • domain string:域名

      • secure:是否只能通过https访问

      • httpOnly bool :是否允许别人通过js获取自己的cookie

    实例演示

    package main
    
    import (
    	"fmt"
    
    	"github.com/gin-gonic/gin"
    )
    
    func Handler(c *gin.Context) {
    	// 获取cookie
    	s, err := c.Cookie("username")
    	if err != nil {
    		s = "Psych"
    		// 设置cookie
    		c.SetCookie("username", s, 60*60, "/", "localhost", false, true)
    	}
    	fmt.Printf("cookie的值为:%s\n", s)
    
    	c.String(200, "测试cookie")
    }
    
    func main() {
    	e := gin.Default()
    	e.GET("/test", Handler)
    	e.Run()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果:

    浏览器输入:localhost:8080/test查看cookie

    在这里插入图片描述

    后台输出:

    在这里插入图片描述

    Cookie练习

    模拟实现权限验证中间件

    • 有2个路由,login和home
    • login用于设置cookie
    • home是访问查看信息的请求
    • 在请求home之前,先跑中间件代码,检验是否存在cookie
    package main
    
    import (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    )
    
    func Login(c *gin.Context) {
    	// 设置cookie
    	c.SetCookie("abc", "123", 60, "/",
    		"localhost", false, true)
    	// 返回信息
    	c.String(200, "Login success!")
    }
    
    func Home(c *gin.Context) {
    	c.JSON(200, gin.H{"data": "home"})
    }
    
    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() {
    	// 创建路由
    	r := gin.Default()
    
    	r.GET("/login", Login)
    	r.GET("/home", AuthMiddleWare(), Home)
    
    	r.Run()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    浏览器输入:localhost:8080/login页面显示为:

    在这里插入图片描述

    更改url为:localhost:8080/home查看cookie:

    在这里插入图片描述

    Cookie的缺点

    • 不安全,明文
    • 增加带宽消耗
    • 可以被禁用
    • cookie有上限
  • 相关阅读:
    宝塔面板一键部署芸众商城智慧商业系统 打造多终端直播分销商城
    学习open62541 --- [69] Client监测多个变量值
    洛谷题单 Part2.1 模拟
    STM32 IWDG(独立看门狗)
    真的,Java并发编程基础入门看这个就够了
    Qt开发 - Qt基础类型
    计算机专业毕设课设选题攻略
    Windows下QT实现托盘程序及系统托盘刷新
    吉利笔试——编程代码题
    JSON Schema的应用(具体的使用场景)
  • 原文地址:https://blog.csdn.net/qq_39280718/article/details/126528489