前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gin框架之session

gin框架之session

作者头像
大话swift
发布2020-03-16 18:33:00
8.4K0
发布2020-03-16 18:33:00
举报
文章被收录于专栏:大话swift大话swift

这篇文章我们讲讲gin中如何使用session

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道你是和谁说话呢?session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。这个时候我们可以采用session共享的方式存取session,例如我们把session放在redis、mysql、mongodb,当然这是后话,我们暂且不讨论。那么,在gin中是如何使用session的呢?

在gin中我们推荐一个类库github地址如下:

代码语言:javascript
复制
https://github.com/gin-contrib/sessions

1、存取session

代码语言:javascript
复制
package main

import (
  "github.com/gin-contrib/sessions"
  "github.com/gin-contrib/sessions/cookie"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  store := cookie.NewStore([]byte("secret"))
  
  //路由上加入session中间件
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/hello", func(c *gin.Context) {
    session := sessions.Default(c)

    if session.Get("hello") != "world" {
      session.Set("hello", "world")
      //记着调用save方法,写入session
      session.Save()
    }

    c.JSON(200, gin.H{"hello": session.Get("hello")})
  })
  r.Run(":8080")
}

但是这种方法没有办法跨路由存取复杂结构的session数据,例如struct,那么我们怎么才可以跨路由存取session的呢?

2、跨路由存取复杂结构的session

代码语言:javascript
复制
package main

import (
  "encoding/gob"
  "github.com/gin-contrib/sessions"
  "github.com/gin-contrib/sessions/cookie"
  "github.com/gin-gonic/gin"
  "net/http"
)

type user struct {
  Name string
  Age  int
}

func main() {
  //把user这个接头体注册进来,后面跨路由才可以获取到user数据
  gob.Register(user{})
  r := gin.Default()
  store := cookie.NewStore([]byte("secret"))

  //路由上加入session中间件
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/hello", func(c *gin.Context) {
    session := sessions.Default(c)

    if session.Get("hello") != "world" {
      session.Set("hello", "world")
      //记着调用save方法,写入session
      session.Save()
    }
    //把结构体存入session中
    session.Set("user", user{"hanyun", 30})
    session.Save()

    c.JSON(200, gin.H{"hello": session.Get("hello")})
  })
  r.GET("/user", func(c *gin.Context) {
    session := sessions.Default(c)
    user := session.Get("user")
    c.JSON(http.StatusOK, gin.H{"user": user})
  })
  r.Run(":8080")
}

想要跨路由存取复杂结构的session,我们首先要把数据类型注册进来,小伙伴们一定不要忘记注册进来。

代码语言:javascript
复制
  gob.Register(user{})

这个类库可以把session放在cookie、redis、memcached、MongoDB、memstore中,具体方法可以查看github地址https://github.com/gin-contrib/sessions

记着关注我哦

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档