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有专门的中间件,安装后就可以使用
使用sessions 中间件注意要点:
session 仓库其实就是一个 map[interface]interface 对象,所有 session可以存储任意数据
session 使用的编解码器是自带的gob,所以存储类似: struct、map 这些对象时需要先注册对象,不然会报错
session 存储引擎支持: cookie、内存、mongodb、redis、postgres、memstore、memcached 以及 gorm 支持的各类数据库(mysql、sqlite)
session 在创建时有一个配置项,可以配置session过期时间、cookie、domain、secure、path等参数
调用 session 方法: Set()、 Delete()、 Clear()、方法后,必须调用一次 Save() 方法。否则session数据不会更新
package mainimport ("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进行操作后,一定要进行savesession.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")
}