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

安装

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

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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

1
2
3
4
5
6
7
8
9
10
11
12
13
启动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

安装

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

使用

1
2
3
4
5
6
7
8
9
10
11
12
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加密密钥