gin框架 cookie

HTTP 是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出。

cookie 是解决 HTTP 协议无状态的方案之一。

cookie 是服务器保存在客户端浏览器的数据,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。

cookie 由服务器创建,并发送给浏览器,最终由浏览器保存。

gin 框架提供了 cookie 操作的支持。

 

1. gin 操作 cookie 的命令

gin 框架通过 gin.Context 结构对象操作 cookie,提供了获取 cookie 数据和写入 cookie 的方法。

gin 框架获取 cookie 键值的方法:

func (c *Context) Cookie(key string) (value string, err error) {

其中 key 为 cookie 键,value 为返回的对应值。

gin 框架写入 cookie 键值的方法:

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

其中 key 为 cookie 键,value 为设置的对应值。

 

2. gin 操作 cookie 的范例

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    engine := gin.Default()

    // 读取 cookie
    engine.GET("/read_cookie", func(context *gin.Context) {
    val, _ := context.Cookie("name")
      context.String(200, "Cookie:%s", val)
    })

    // 写入 cookie
    engine.GET("/write_cookie", func(context *gin.Context) {
       context.SetCookie("name", "Shimin Li", 24*60*60, "/", "localhost", false, true)
    })

    // 清理 cookie
    engine.GET("/clear_cookie", func(context *gin.Context) {
      context.SetCookie("name", "Shimin Li", -1, "/", "localhost", false, true)
    })

    engine.Run()
}

运行程序,在浏览器端分别执行写入、读取、清除的操作分别是:

  • http://localhost:8080/write_cookie
  • http://localhost:8080/read_cookie
  • http://localhost:8080/clear_cookie

 

3. cookie 的缺陷

  • 不安全,明文
  • 可以被禁用
  • 增加带宽消耗
  • cookie 数量有上限

针对 cookie 的缺陷,还有另外的解决方案,比如 jwt。

web 应用程序中, 记录客户端的状态除了使用 cookie 外,还经常使用 session。session 是服务器端使用的一种记录客户端状态的机制,使用上比 cookie 简单一些,相应的也增加了服务器的存储压力。gin 框架提供了 session 操作的支持。通常我们使用 gorilla/sessions包,它是由第三方提供的 session 操作包。