gin会话控制篇 - Cookie和Session

1. Cookie介绍

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

2. Cookie的使用

  • 测试服务端发送cookie给客户端,客户端请求时携带cookie

    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.Printf("cookie的值是: %s\n", cookie)
    })
    r.Run(":8000")
    }

3. Sessions

gorilla/sessions为自定义session后端提供cookie和文件系统session以及基础结构。

主要功能是:

  • 简单的API:将其用作设置签名(以及可选的加密)cookie的简便方法。
  • 内置的后端可将session存储在cookie或文件系统中。
  • Flash消息:一直持续读取的session值。
  • 切换session持久性(又称"记住我")和设置其他属性的便捷方法。
  • 旋转身份验证和加密密钥的机制。
  • 每个请求有多个session,即使使用不同的后端也是如此。
  • 自定义session后端的接口和基础结构:可以使用通用API检索并批量保存来自不同商店的session。

代码:

复制代码
package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/sessions"
)

// 初始化一个cookie存储对象
// something-very-secret应该是一个你自己的密匙,只要不被别人知道就行
var store = sessions.NewCookieStore([]byte("something-very-secret"))

func main() {
    http.HandleFunc("/save", SaveSession)
    http.HandleFunc("/get", GetSession)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        fmt.Println("HTTP server failed,err:", err)
        return
    }
}

func SaveSession(w http.ResponseWriter, r *http.Request) {
    // Get a session. We're ignoring the error resulted from decoding an
    // existing session: Get() always returns a session, even if empty.

    // 获取一个session对象,session-name是session的名字
    session, err := store.Get(r, "session-name")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 在session中存储值
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    // 保存更改
    session.Save(r, w)
}
func GetSession(w http.ResponseWriter, r *http.Request) {
    session, err := store.Get(r, "session-name")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    foo := session.Values["foo"]
    fmt.Println(foo)
}

删除session的值:

复制代码
    // 删除
    // 将session的最大存储时间设置为小于零的数即为删除
    session.Options.MaxAge = -1
    session.Save(r, w)
相关推荐
我的golang之路果然有问题1 天前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
fashia3 天前
Java转Go日记(六十):gin其他常用知识
开发语言·后端·golang·go·gin
我的golang之路果然有问题4 天前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin
fashia4 天前
Java转Go日记(五十七):gin 中间件
开发语言·后端·golang·go·gin
夏沫mds5 天前
不动产登记区块链系统(Vue3 + Go + Gin + Hyperledger Fabric)
linux·golang·区块链·gin·fabric
比特森林探险记5 天前
Go Gin框架深度解析:高性能Web开发实践
前端·golang·gin
在成都搬砖的鸭鸭5 天前
【Golang】使用gin框架导出excel和csv文件
golang·excel·gin
三金C_C6 天前
gin 框架
go·gin·后端框架
Chandler246 天前
Go 即时通讯系统:日志模块重构,并从main函数开始
后端·重构·golang·gin
三金C_C6 天前
gin 常见中间件配置
中间件·gin