Gin处理Session的实现

 更新时间:2026年07月07日 08:37:09   作者:H_拾忆  
Session 用于维持用户会话状态,Gin 可借助 sessions 组件实现登录态留存,支持 Cookie 本地存储与 Redis 集群分布式存储,配置加密密钥保障安全,感兴趣的可以了解一下

1.Session:

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

2.Session作用:

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

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

2.1demo:

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:

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:

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:

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的服务器,并使用秘钥进行了加密.

到此这篇关于Gin处理Session的实现的文章就介绍到这了,更多相关Gin处理Session内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言如何通过通信共享内存

    Go语言如何通过通信共享内存

    这篇文章主要为大家介绍了Go语言如何通过通信共享内存实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 在Go语言单元测试中解决HTTP网络依赖问题

    在Go语言单元测试中解决HTTP网络依赖问题

    在 Go 语言中,我们需要找到一种可靠的方法来测试 HTTP 请求和响应,本文将探讨在 Go 中进行 HTTP 应用测试时,如何解决应用程序的依赖问题,以确保我们能够编写出可靠的测试用例,需要的朋友可以参考下
    2023-07-07
  • go语言实现十大常见的排序算法示例

    go语言实现十大常见的排序算法示例

    这篇文章主要为大家介绍了go语言实现十大常见的排序算法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 详解golang执行Linux shell命令完整场景下的使用方法

    详解golang执行Linux shell命令完整场景下的使用方法

    本文主要介绍了golang执行Linux shell命令完整场景下的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • golang使用sort接口实现排序示例

    golang使用sort接口实现排序示例

    这篇文章主要介绍了golang使用sort接口实现排序的方法,简单分析了sort接口的功能并实例演示了基于sort接口的排序实现方法,需要的朋友可以参考下
    2016-07-07
  • 盘点总结2023年Go并发库有哪些变化

    盘点总结2023年Go并发库有哪些变化

    这篇文章主要为大家介绍了2023年Go并发库的变化盘点总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go  import _ 下划线使用

    Go  import _ 下划线使用

    这篇文章主要为大家介绍了Go  import下划线_使用小技巧,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 使用Go+GoQuery库实现头条新闻采集

    使用Go+GoQuery库实现头条新闻采集

    在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容,我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性,我们将使用多线程技术,提高采集效率,最后,我们将展示爬虫程序的运行结果和代码,需要的朋友可以参考下
    2023-10-10
  • Go语言使用Goroutine并发打印的项目实践

    Go语言使用Goroutine并发打印的项目实践

    本文通过并发打印任务案例,讲解Go语言Goroutine的使用、同步控制及高并发优势,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • 解决golang 关于全局变量的坑

    解决golang 关于全局变量的坑

    这篇文章主要介绍了解决golang 关于全局变量的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05

最新评论