「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
前言
session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。简单的说就是服务器为了保存用户状态而创建的一个特殊对象。
session特点
1. session保存的位置是在服务器端。
2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能。
3. 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题。
gin中使用session
引入session框架
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"net/http")
func GetSession(c *gin.Context) {
s := sessions.Default(c)
v :=s.Get("token")
c.JSON(http.StatusOK, gin.H{"status": "200","token":v})}
func SaveSession(c *gin.Context) {
s := sessions.Default(c)
s.Set("token","0x123456")
s.Save()
c.JSON(http.StatusOK, gin.H{"status": "200","success":true})}
func deleteSession(c *gin.Context) {
s := sessions.Default(c)
s.Delete("token")
s.Save()
c.JSON(http.StatusOK, gin.H{"status": "200","success":true})}
定义了一个conreoller文件,编写2个方法。在main方法启动我们的服务。
var store = cookie.NewStore([]byte("secret"))
// 1.创建路由
r := gin.Default()
// 注册中间件
r.Use(MiddleWare())
r.Use(sessions.Sessions("sessionid", store))
// 2.绑定路由规则,执行的函数r.GET("/saveSession",SaveSession)
r.GET("/getSession",GetSession)
r.GET("/deleteSession",deleteSession)
r.Run(":8000")
先访问 http://localhost:8080/getSession 获取session测试一下,可以看到
因为还没有设置session,所以这时候访问肯定是空的。接着我们访问
http://localhost:8080/saveSession,然后在访问getSession。
session已经存在我们的这次会话里了。接着我们可以删除后在访问。
这时候删除成功了,在重新访问getSession就会发现token的session已经为空了。
总结
session机制总结来说具有以下特点。
- 保存服务端,数据量可以存很大(只要服务器支持)
- 保存在服务端也相对保存在客户端更安全
- 需要自己去维护一个Session服务,会提高系统的复杂度。
所以和cookie对比起来,总结差不多以下几点
1.两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)
2.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie;
3.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型);
综上所述,如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。