首页 > 其他分享 >Gin中的Session

Gin中的Session

时间:2024-01-17 11:12:24浏览次数:22  
标签:count session sessions redis Session gin Gin

Gin中的Session

1 Session简单介绍

session 是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

2 Session的工作流程

当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对,然后将 value保存到服务器 将Key(cookie)返回到浏览器(客户端)。浏览器下次访问时会携带key(cookie),找到对应的session(value)

3 Gin中使用Session

Gin官方没有给我们提供Session相关的文档,这个时候我们可以使用第三方的Session中间件来实现

https://github.com/gin-contrib/sessions

gin-contrib/sessions 中间件支持的存储引擎:
cookie
memstore
redis
memcached
mongodb

4 基于Cookie存储Session

package main

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

func main() {
  r := gin.Default()
  // 创建一个基于cookie的存储引擎 secret是用于加密的密钥可以随意更改
  store := cookie.NewStore([]byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    var count int
    // 获取session
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    // 设置session
    session.Set("count", count)
    // 必须调用 才能保存
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

5 基于redis实现分布式Session (只需要改变一下存储引擎,改为redis)

package main

import (
  "github.com/gin-contrib/sessions"       // 引入
  "github.com/gin-contrib/sessions/redis" // 引入
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  // 创建一个基于redis的存储引擎 secret是用于加密的密钥可以随意更改
  store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    var count int
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    session.Set("count", count)
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

/*
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
	
	第一个参数 size 连接数
	第二个参数 network 网络
	第三个参数 address 地址
	第四个参数 password 密码
	第五个参数 keyPairs 用于加密的密钥

*/

6 设置Session的过期时间

package main

import (
  "github.com/gin-contrib/sessions"       // 引入
  "github.com/gin-contrib/sessions/redis" // 引入
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  // 创建一个基于redis的存储引擎 secret是用于加密的密钥可以随意更改
  store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    // 配置过期时间
    session.Options(session.Options{
        MaxAge : 3600 * 6 // 6小时 单位是秒 默认是30天      
    })
      
    var count int
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    session.Set("count", count)
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

标签:count,session,sessions,redis,Session,gin,Gin
From: https://www.cnblogs.com/chunyouqudongwuyuan/p/17969519

相关文章

  • Gin中的Cookie
    Gin中的Cookie1Cookie简介/* ●HTTP是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用Cookie或者Sessio......
  • GIn入门
    Gin入门1.Gin安装goget-ugithub.com/gin-gonic/gin2.将gin引入到代码中:import"github.com/gin-gonic/gin"2.1(可选)如果使用诸如http.StatusOK之类的常量,则需要引入net/http包:import"net/http"2.2初始化gomodgomodinit/*生成go.mod文件,此命令会在当......
  • 出现了HTTPSConnectionPool(host=‘huggingface.co‘, port=443)错误的解决方法
    在下载huggingface模型的时候,经常会出现这个错误,HTTPSConnectionPool(host=‘huggingface.co’,port=443)。如在下载Tokenizer的时候,tokenizer=AutoTokenizer.from_pretrained("csebuetnlp/mT5_multilingual_XLSum")就会出现以上的错误HTTPSConnectionPool(host=‘hug......
  • Inserting a node at beginning,全局变量头指针【1月16日学习笔记】
    点击查看代码//insertinganodeatbeginning,全局变量头指针#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*A;voidinsert(intx){ node*temp=newnode;//创建新节点 temp->data=x; temp->next=A;//新节点尾巴指......
  • Inserting a node at beginning,局部变量头指针版本1【1月16日学习笔记】
    点击查看代码//insertinganodeatbeginning,局部变量头指针版本1#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*insert(intx,node*A){ node*temp=newnode;//创建新节点 temp->data=x; temp->next=A;//新节......
  • Inserting a node at beginning,局部变量头指针版本2【1月16日学习笔记】
    点击查看代码//insertinganodeatbeginning,局部变量头指针版本2#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};voidinsert(intx,node**A){ node*temp=newnode;//创建新节点 temp->data=x; temp->next=*A;//新......
  • FlaskSQLAlchemy中的Pagination类型对象
    FlaskSQLAlchemy中的Pagination类型对象。一个Query对象调用paginate方法就获得了Pagination对象。paginate方法传入了两个参数,一个是当前页,另一个是每一页最多显示多少博客。paginate的返回值为代表当前页的Pagination对象。一个Paginationi对象的常用属性有:items当前页面中的......
  • 15、nginx的rewrite机制
    1.概述Rewrite主要的功能就是实现URL的重写。Nginx的Rewrite规则采用PCRE(PerlCompatibleRegularExpressions)Perl兼容正则表达式的语法进行规则匹配。通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。例如,一些使用MVC框架的程序只有一个入口,可以通过......
  • Nginx转发解析长域名多路径域名
    Nginx解析短域名,例如:访问http://192.168.1.23可直接跳转到http://192.168.1.23/webroot/decisionserver{listen90;server_namelocalhost;#匹配/转到/webroot/decision上;#^(.*)$表示/后任意部分,除非和其他location匹配否则一律转向/webroot/decisio......
  • Mygin实现简单的路由
    本文是Mygin第二篇目的:实现路由映射提供了用户注册静态路由方法(GET、POST方法)基于上一篇Mygin实现简单Http且参照Gin我使用了map数组实现简单路由的映射关系不同的method对应一个组,Gin框架初始化时map时初始化9个,因为支持的http.method刚好为9个packagehttp//Gin......