Gin- Cookie\Session相关

server/2024/12/19 15:16:40/

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 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")
}

http://www.ppmy.cn/server/151468.html

相关文章

Spring Boot 中使用 Mybatis Plus

Spring Boot 中使用 Mybatis Plus 在现代的企业级开发中,MyBatis Plus 是 MyBatis 的增强工具,它简化了很多常见的数据库操作。通过 Spring Boot 集成 MyBatis Plus,可以快速构建高效、简洁的数据库操作层。本文将介绍如何在 Spring Boot 项…

vimdc

set nocompatible filetype on set rtp~/.vim/bundle/Vundle.vim call vundle#begin() " 这里根据自己需要的插件来设置,以下是我的配置 " " " YouCompleteMe:语句补全插件 set runtimepath~/.vim/bundle/YouCompleteMe autocmd InsertLe…

前端面试汇总(不定时更新)

目录 HTML & CSS1. XML、HTML、XHTML 有什么区别?⭐2. XML和JSON的区别?3. 是否了解W3C的规范?⭐4. 什么是语义化标签?⭐⭐5. 行内元素和块级元素的区别?⭐6. 行内元素和块级元素的转换?⭐7. 常用的块级…

前端知识点---字符串的函数

文章目录 1. length2. charAt(index)3. indexOf(searchValue, start)4. lastIndexOf(searchValue, start)5. slice(start, end)6. substring(start, end)7. substr(start, length)8. toUpperCase() 和 toLowerCase()9. trim()10. split(separator)11. replace(searchValue, new…

力扣hot100——哈希

1. 两数之和 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans;map<int, int> mp;for (int i 0; i < nums.size(); i) {if (mp.count(target - nums[i])) {ans.push_back(mp[target - nums[i]])…

scanf 缓冲区与输入处理机制

在C语言编程中&#xff0c;输入输出的问题常常让初学者感到困惑&#xff0c;尤其是scanf函数的行为特性。这篇文章将深入探讨scanf的工作原理&#xff0c;以及它与输入缓冲区之间的关系。相信读完后&#xff0c;您会对这个看似简单却暗藏玄机的话题有全新的认识。 缓冲区是操作…

XML Schema 复合类型 - 混合内容

XML Schema 复合类型 - 混合内容 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中&#xff0c;复合类型是一种包含其他元素和/或属性的复杂类型。混合内容&#xff08;Mixed Content&#xff09;是复合类型的一种特殊形式&#xff0c;它允许元素包含其…

DP3复现代码运行逻辑全流程(六)—— gen_demonstration_adroit.sh 演示生成与可视化

用于生成演示、培训和评估的脚本都在 Scripts/ 文件夹中 DP3 通过 gen_demonstration 生成演示&#xff0c;即训练数据&#xff0c;例如: bash scripts/gen_demonstration_adroit.sh hammer 这将在 Adroit 环境中生成锤子任务的演示。数据将自动保存在 3D-Diffusion-Policy/…