Gin中session和cookies

session

什么是session

  • Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制
  • 它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中
  • 在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。其实并不是Session消失了,而是Session ID变了

什么是cookie?

  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息
  • 每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。它的过期时间可以任意设置,如果你不主动清除它,保留

二者对比

  1. Cookie 在客户端(浏览器),Session 在服务器端
  2. Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了
  3. 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie
  4. Session 可以放在 文件、数据库或内存中
  5. 用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID
  6. Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)

在Gin中使用session

安装

go get github.com/gin-contrib/sessions

使用

func Session(){
store:=cookie.NewStore([]byte("piwriw"))
// use seesion middleware
router.Use(sessions.Sessions("gin_session"),store)
}


// Controller
func SessionTestController(ctx *gin.Context) {
// 初始化session对象
session := sessions.Default(ctx)

// 设置session
session.Set("name","hallen")
session.Set("age",18)
session.Set("addr","xxx")

// 获取session
name := session.Get("name")
fmt.Println("================++++++++++")
fmt.Println(name)

// 删除指定key的session
session.Delete("name")

name2 := session.Get("name")
fmt.Println("================++++++++++")
fmt.Println(name2)

fmt.Println(session.Get("age"))
// 删除所有的session
session.Clear()
fmt.Println(session.Get("age"))
fmt.Println(session.Get("addr"))

// 保存session
session.Save()
}

Redis-session

redis-client

启动cli:
redis-cli
或者使用密码:redis-cli -a hallen

使用:
查看所有的key列表: keys *
设置键值: SET key_name value
查看指定key: GET key_name
删除键及对应的值: DEl key_name
修改 key 的名称: RENAME key_name newkey_name

判断key是否存在: EXISTS key_name
查看key对应的value类型: TYPE key_name

安装

go get github.com/gin-contrib/sessions/redis

使用

store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("hallen"))

router.Use(sessions.Sessions("session_test",store))



参数说明:
第1个参数 - redis最大的空闲连接数
第2个参数 - 数通信协议tcp或者udp
第3个参数 - redis地址, 格式,host:port
第4个参数 - redis密码,如果没有密码则为空字符串
第5个参数 - session加密密钥