Gin- Cookie\Session相关

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

Cookie,Session是什么?

Cookie直译小饼干,是一些数据信息,类似于小型文本文件,存储在浏览器上。Cookie是进行第一次登录之后,由服务器创建后返回给浏览器的。之后,每当浏览器再次向同一服务器发送请求时,它会自动将这个Cookie附加在请求头中,服务器通过解析这个Cookie来识别用户。

 

 

Session也是在第一次请求服务器时由服务端生成的,但是保存在服务器上,服务器会创建一个session对象,并生成唯一的sessionID,保存在cookie中。之后再次访问该服务器时,会携带这个sessionID,服务器通过这个id找到session独享,从而维持用户的状态。

为什么要有Cookie,Session

因为Http是无状态的,无法保存登录信息,因此通过Cookie,Session,下次再进行登录时,服务器可以识别用户,保存用户的登陆状态和登录信息。

想起来还有Token,就去学习了一下

Token是令牌的意思,是服务端生成的一串字符串,在首次访问后服务器端生成后返回给客户,之后客户端不再需要用户名和密码,只需要带上这个Token就可以请求数据,token即客户端和服务器之间的一种约定吧。

总的来说

 第一次登录,服务器给客户端颁发一个唯一的sessionId, 并通过http的响应头返回。客户端(浏览器)发现返回的数据中有cookie数据就把这个cookie数据存放到内存。下次再发送http请求时,把内存中的cookie数据再塞到http请求头中,一并发给服务器,服务器在解析请求时,发现请求头中有cookie,就开始识别cookie中的sessionId,拿到sessionId,我们就知道这个请求时由哪个客户端发送来的了。

gin配置session

gin框架处理session有专门的中间件,安装后就可以使用

go get github.com/gin-contrib/sessions

使用sessions 中间件注意要点:

  1. session 仓库其实就是一个 map[interface]interface 对象,所有 session可以存储任意数据

  2. session 使用的编解码器是自带的gob,所以存储类似: struct、map 这些对象时需要先注册对象,不然会报错

  3. session 存储引擎支持: cookie、内存、mongodb、redis、postgres、memstore、memcached 以及 gorm 支持的各类数据库(mysql、sqlite)

  4. session 在创建时有一个配置项,可以配置session过期时间、cookie、domain、secure、path等参数

  5. 调用 session 方法: Set()、 Delete()、 Clear()、方法后,必须调用一次 Save() 方法。否则session数据不会更新

package main

import (
	"encoding/gob"
	//session包
	"github.com/gin-contrib/sessions"
	//session存储引擎包
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

type User struct {
	Username string `json: username`
	Password string `json: password`
}

func main() {
	router := gin.Default()
	// 创建基于cookie的存储殷勤,secret用于加密,可以随便填写
	store := cookie.NewStore([]byte("secret"))
	//设置session中间件,参数mysession,指的是session的名字,也是cookie的名字
	router.Use(sessions.Sessions("mysession", store))
	//session 使用的编解码器是自带的gob,所以存储类似: struct、map 这些对象时需要先注册对象
	gob.Register(User{})

	router.GET("/hello", func(c *gin.Context) {
		user := User{"zhangsan", "123456"}
		//初始化session对象
		session := sessions.Default(c)
		//Set设置session值,k-v类型
		session.Set("user", user)
		//保存session对象,对session进行操作后,一定要进行save
		session.Save()

		c.JSON(200, user)
	})

	router.GET("/user", func(c *gin.Context) {
		session := sessions.Default(c)
		//获取session值
		user := session.Get("user")
		c.JSON(200, user)
	})

	router.Run(":8080")
}

网站公告

今日签到

点亮在社区的每一天
去签到