Go语言学习笔记(十八)Gin处理Session

1.Session:

Seesion是用户与计算机程序(通常是网络浏览器或移动程序)之间交互的一段时间.在此期间,用户执行的一系列由程序处理的操作或请求,程序会维护有关活动的状态信息.例如用户的身份 偏好和当前的Session数据.

2.Session作用:

保持用户登录状态:即使用户离开程序并稍后返回,仍能保持用户登录状态.

提供个性化体验:根据用户之前的交互和偏好,显示相关的内容或信息.

2.1demo:

go 复制代码
package main

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

func main() {
	request := gin.Default()
	//用secret进行加密.
	store := cookie.NewStore([]byte("secret"))
	request.Use(sessions.Sessions("mysession", store))
}

创建了一个基于Cookie的Session存储.并使用秘钥进行加密.

3.登录路由设置Session:

css 复制代码
package main

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

func main() {
	request := gin.Default()
	request.POST("/login", func(c *gin.Context) {
		userName := c.PostForm("username")
		passWord := c.PostForm("password")
		if userName != "" && passWord != "" {
			session := sessions.Default(c)
			session.Set("username", userName)
			session.Save()
			c.JSON(http.StatusOK, gin.H{"message":"登录成功"})
		}else {
			c.JSON(http.StatusNotFound, gin.H{"message":"未找到登录人"})
		}
	})
}

4.中间件校验Session:

go 复制代码
func checkUserName() gin.HandlerFunc {
	return func(c *gin.Context) {
		userName := sessions.Default(c).Get("username")
		if userName == nil {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "未授权访问"})
			return
		}
		c.Set("username", userName)
		c.Next()
	}
}

5.Redis存储Session:

go 复制代码
package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	request := gin.Default()
	store, err := redis.NewStore(10, "tcp", "localhost:6379", "", "", []byte("secret"))
	if err != nil {
		panic(err)
	}
	request.Use(sessions.Sessions("mysession", store))
	request.POST("/login", func(c *gin.Context) {
		userName := c.PostForm("username")
		password := c.PostForm("password")
		if userName != "" || password != "" {
			session := sessions.Default(c)
			session.Set("username", userName)
			session.Save()
			c.JSON(http.StatusOK, gin.H{"message": "登录成功"})
		} else {
			c.JSON(http.StatusNotFound, gin.H{"message": "用户名错误"})
		}
	})
}

func checkUserName() gin.HandlerFunc {
	return func(c *gin.Context) {
		userName := sessions.Default(c).Get("username")
		if userName == nil {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "未授权访问"})
			return
		}
		c.Set("username", userName)
		c.Next()
	}
}

上述代码中利用redis作为Session存储引擎.首先创建了一个具有十个连接池的Redis存储.连接到了位于localhost:6379的服务器,并使用秘钥进行了加密.

相关推荐
by组态几秒前
Ricon组态系统API参考手册
前端·后端·物联网
再吃一根胡萝卜17 分钟前
Agent 如何选择与生成 SQL —— Text2SQL 全链路详解
后端
苍何20 分钟前
把操作流程直接录成 Skill,豆包太夯了!
后端
Go_error38 分钟前
在 Go 服务层中如何优雅地管理事务?
后端·go
爱读源码的大都督1 小时前
DeepSeek面试官问:多租户 RAG 系统怎样实现细粒度权限控制?
后端·面试·架构
苍何1 小时前
我们终于成立了 AgentWork 开源社区,16.4 万字豆包工作蓝皮书同步开源(建议收藏)
后端
苍何1 小时前
用 AI 做短剧出海,赚麻了!(附 Skill 及教程)
后端
积硅步致千里1 小时前
Fyne 兼容性:报错还能救,透明窗才要命
前端·后端
苍何1 小时前
国产大模型竟然干过了 Claude!!
后端