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 操作包。