gin cookie和session
Cookie
● HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie 或者 Session 实现
● cookie 是存储于访问者计算机的浏览器中(比如保存用户的登录状态),可以让我们用同一个浏览器访问同一个域名的时候共享数据
设置和获取cookie
- context.Set()只能实现一个页面中的数据共享
- Cookie可以实现多个页面中的数据共享
router.POST("/index", func(context *gin.Context) {
/*
SetCookie参数:
name:key
value:值
maxAge int : 过期时间,单位秒
path:cookie生效的路径,设置为"/"时,表示该Cookie将在整个网站的任何路径下都可用,只要属于同一个域名
domain string:cookie对应的域,本地域名使用localhost
secure bool : 是否安全的cookie(只在https协议下生效)
httpOnly bool:是否限制浪拉山情脚本对cookie的操作,比如使用JavaScript等客户端脚本语言访问该Cookie
*/
// 设置cookie
context.SetCookie("username", "li", 3600, "/", "localhost", false, false)
})
func (con DefaultController) GetInfo(context *gin.Context) {
// 获取cookie
username, err := context.Cookie("username")
if err != nil {
context.String(http.StatusBadRequest,"cookie获取失败")
return
}
context.String(http.StatusOK,username)
}
删除cookie
// 设置cookie的时间为-1
context.SetCookie("username", "li", -1, "/", "localhost", false, false)})
多个二级域名共享cookie
// 设置cookie的的域
// 设置的域为.itying.com,那么 任意前缀.itying.com 都可以共享cookie,比如a.itying.com、b.itying.com
context.SetCookie("username", "li", 3600, "/", ".itying.com", false, false)
session
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session保存在服务器上
当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个 session 对象,生成一个类似于 key,value 的键值对,然后将 value 保存到服务器 将 key(cookie)返回到浏览器(客户)端。浏览器下次访问时会携带 key(cookie),找到对应的session(value)
基于cookie存储session
Gin 官方没有给我们提供 Session,可以使用第三方的 Session 中间件来实现
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
配置中间件
// cookie.NewStore创建一个基于cookie的存储引擎,参数是字节切片,自定义的用于加密的密钥
// 如果我们想将 session 数据保存到 redis而非Server本地,只要将 session 的存储引擎改成 redis引擎 即可
store := cookie.NewStore([]byte("ses7655s"))
// 设置session中间件,第一个参数是session的名字,也是cookie的名字,store的创建的存储引擎,也可以替换其他的存储引擎
router.Use(sessions.Sessions("sessionName", store))
设置session
func (con DefaultController) SetSession(context *gin.Context) {
// 获取session对象
// sessions.Default创建一个默认的会话管理器,返回一个*sessions.Session对象,用于管理和存储会话数据
session := sessions.Default(context)
// 设置过期时间,如果不设置,默认的过期时间是30天
session.Options(sessions.Options{
MaxAge: 3600 * 6, // 过期时间是秒
})
// 设置session
session.Set("username", "li")
// 保存session,必须调用
session.Save()
}
获取session
func (con DefaultController) GetSession(context *gin.Context) {
session := sessions.Default(context)
// 获取session
username := session.Get("username")
user,_ := username.(string)
context.String(http.StatusOK, user)
风月都好看,人间也浪漫.