gin框架 session

web 应用程序中, 记录客户端的状态除了使用 cookie 外,还经常使用 session。

session 是服务器端使用的一种记录客户端状态的机制,存储在服务器上,使用上比 cookie 简单,但会增加服务器的存储压力。

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

 

1. 什么是 session

session 是另一种记录客户状态的机制,不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。

客户端浏览器再次访问时只需要从该 session 中查找该客户的状态就可以了。

如果说 cookie 机制是通过检查客户身上的 “通行证” 来确定客户身份的话,那么 session 机制就是通过检查服务器上的 “客户明细表” 来确认客户身份。

session 相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

 

2. gin 使用 session 的方法

go 语言 和 gin 框架都没有单独提供 session 对象或者操作方法。

通常我们使用 gorilla/sessions包,它是由第三方提供的 session 操作包。

官方网址:http://www.gorillatoolkit.org/pkg/sessions

github:https://github.com/gin-gonic/gin

 

3. gin 使用 session 的范例

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/sessions"
)

// 初始化一个cookie存储对象
// session-secret是密匙
var store = sessions.NewCookieStore([]byte("session-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
    }
}

// 写入 session
func SaveSession(w http.ResponseWriter, r *http.Request) {
    // 获取一个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)
}

// 读取 session
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
func RemoveSession(w http.ResponseWriter, r *http.Request) {
    session, err := store.Get(r, "session-name")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 设置session的最大存储时间小于零,即删除
    session.Options.MaxAge = -1
    session.Save(r, w)
}

gin 框架允许在请求处理过程中,加入用户自己的钩子函数,这个钩子函数就叫中间件。中间件的英文名称为 MiddleWare。gin 中间件常用于处理一些公共业务逻辑,比如登陆校验,耗时统计,日志打印等工作。