golang利用redis和gin实现保存登录状态,校验登录

这篇具有很好参考价值的文章主要介绍了golang利用redis和gin实现保存登录状态,校验登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

保存用户登录状态,一般常用的方式有两种

一、生成token,然后token保存到数据库用户表里面,每次登录的时候,自动更新,容纳后每次用的时候,去取出来校验,这种方式,数据库压力大,而且不是很灵活

二、每次登录生成token,然后token保存到Redis缓存中,每次都去校验,不仅快速,而且,数据库压力也小

1.启动时候,加载Redis项

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang

2、Redis(附带参数文件)

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang

前期准备工作好之后

1、路由,利用路由文件,添加中间件,将所有需要验证token的接口放一起

        比如前端要访问的接口是“api/index/index”

package router

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"hexiao/service"
)

func Router() *gin.Engine {
	r := gin.Default()

	//修改密码
	r.POST("api/user/changepwd", service.ChangePwd)
	//登录
	r.POST("api/user/login", service.Login)


	//设置需要登录验证的一些函数
	IndexGroup := r.Group("/api/index")

	{
		//调用中间件
		IndexGroup.Use(service.AuthMiddleWare())
		IndexGroup.POST("/index", service.IndexInfo)
	}

	return r
}

中间件控制


//token存入redis部分代码
token := "xxxxxxxxxxxxxx"
ctx := context.Background()
userID := "online_" + fmt.Sprintf("%d", adminuser2.Id)
time2 := time.Duration(viper.GetInt("timeout.RedisOnlineTime")) * time.Hour
err := utils.Red.Set(ctx, userID, token, time2)
if err != nil {
	fmt.Println("set  err=", err)
}

//取token验证中间件
func AuthMiddleWare() gin.HandlerFunc {
	return func(c *gin.Context) {
		ctx := context.Background()
		userid1 := c.PostForm("user_id")
		token := c.PostForm("token")
		if token == "" {
			c.JSON(200, gin.H{
				"code": 300,
				"data": "",
				"msg":  "请携带token!",
			})
			c.Abort()
			return
		}
		userID := "online_" + userid1
		r, err := utils.Red.Get(ctx, userID).Result()
		if err != nil {
			fmt.Println("err>>>>>>", err)
		}
		if r != token {
			c.JSON(200, gin.H{
				"code": 300,
				"data": "",
				"msg":  "登录失效,请重新登录!",
			})
			c.Abort()
			return
		}

	}
}

具体的token组装方式,自己确定,我这边采用的是固定字符串+user_id的方式,

token可以由body中传,也可以由header中传

效果

无token:

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang

token错误:

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang

token正确

golang利用redis和gin实现保存登录状态,校验登录,golang,gin,redis,golang文章来源地址https://www.toymoban.com/news/detail-809259.html

到了这里,关于golang利用redis和gin实现保存登录状态,校验登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang --gin+websocket实现指定的数据点推送

    这里提到的endpointId是一个负载了数据的逻辑点,就像一根水管的出口,有新数据来就会根据后端记录的endpointId推送到用户正在查看的endpointId。用户没有正在查看的endpoint就不会有新数据推送。这里如果如果对endpoint加上权限就相当于实现对实时数据的准确推送。 这里的代码

    2024年02月01日
    浏览(31)
  • 【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】

    🌼 文章基于 B 站黑马程序员视频教程编写 🌼 做笔记便于日后复习 ① 手机号格式后端校验 手机号校验的正则表达式 校验工具类: ② 生成短信验证码 🌼 hutool 工具的详细使用: https://doc.hutool.cn/pages/index/ 🌿 根据 Cookie 中的 JSESSIONID 获取到 Session 🌿 然后从 Session 中获取到

    2024年02月11日
    浏览(44)
  • SSE与WebSocket分别实现服务器发送消息通知(Golang、Gin)

    服务端推送,也称为消息推送或通知推送,是一种允许应用服务器主动将信息发送到客户端的能力,为客户端提供了实时的信息更新和通知,增强了用户体验。 服务端推送的背景与需求主要基于以下几个诉求: 实时通知:在很多情况下,用户期望实时接收到应用的通知,如

    2024年02月03日
    浏览(37)
  • 如何利用 IDataErrorInfo 实现数据校验

    一、定义: ValidatesOnDataErrors 是一种在 WPF 中实现数据校验的方式,可以通过在 XAML 中设置属性 ValidatesOnDataErrors 为 True 来启用。 二、使用: ① 在 ViewModel 中实现 IDataErrorInfo 接口,该接口定义了两个属性:Error 和 Item[string columnName] —— Error 属性返回 ViewModel 中所有错误的描

    2024年02月06日
    浏览(23)
  • 完美实现校验:利用Spring Validation实现强大的输入验证

    校验例子 大家平时编码中经常涉及参数的校验,对于一个用户注册的方法来说会校验用户名密码信息: 上述例子中需要手动编写参数校验逻辑的过程。虽然对于这个简单的示例而言,手动编写校验逻辑可能是可行的,但是对于复杂的验证规则和多个参数的情况,手动编写校

    2024年01月20日
    浏览(31)
  • gin中使用validator做参数校验

    在web开发中对请求参数进行校验,通常在代码中定义与请求参数相对应的模型(结构体),借助模型绑定快捷地解析请求中的参数,例如 gin 框架中的 Bind 和 ShouldBind 系列方法。 gin框架使用github.com/go-playground/validator进行参数校验,目前已经支持 github.com/go-playground/validator/v1

    2024年01月23日
    浏览(33)
  • 【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

    OpenTelemetry中文文档:https://github.com/open-telemetry/docs-cn/blob/main/OT.md 之前用的是jaeger实现链路追踪,但是想要换成Zipkin等框架或集成指标监控或集成日志会换框架很麻烦。 OpenTracing制定了一套平台无关、厂商无关的协议标准,使得开发人员能够方便的添加或更换底层APM的实现。

    2024年02月06日
    浏览(29)
  • Go的gin参数校验之validator库

    使用 validator 以后,只需要在定义结构体时使用 binding 或 validate tag标识相关校验规则,就可以进行参数校验了,而不用自己单独去写常见的校验规则。 常用约束如下: 字符串约束 excludesall:不包含参数中任意的 UNICODE 字符,例如excludesall=ab; excludesrune:不包含参数表示的

    2024年02月12日
    浏览(28)
  • golang微框架Gin

    Gin是一个golang的微框架,基于httprouter,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 Gin特征 速度快:基于基数树的路由,内存占用小,没有反射,可预测的APi性能 中间件支持 传入的http请求可以有中间件链和最终操作处理,例如:Logger,Aut

    2024年02月09日
    浏览(31)
  • 利用Golang pipe实现远程交互

    本文介绍Golang pipe,以及在不同场景下的应用。 pipe实现从一个进程重定向至另一个进程,它是双向数据通道,用于实现进行间通信。 io.Pipe函数创建内存同步通道,用于连接io.Reader和io.Writer. 本文示例使用环境为: 在实现远程交互之前,先看下面简单示例,演示如何使用io.Pi

    2024年02月02日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包