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

news2024/9/28 7:50:47

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

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

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

1.启动时候,加载Redis项

2、Redis(附带参数文件)

前期准备工作好之后

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:

token错误:

token正确

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

表的增删改查CURD(基础)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 新增(Create) 全列插入 指定列…

GB/T28181-2022之图像抓拍规范解读和设计实现

技术背景 GB/T28181-2022相对2016版,对图像抓拍有了明确的界定,图像抓拍在视频监控行业非常重要, Android平台GB28181设备接入端,无需实时上传音视频实时数据的情况下,就可以抓图上传到指定的图像存储服务器上。 图像抓拍基本要…

Ubuntu20.04安装配置OpenCV-Python库并首次执行读图

一、选择三方提供的预编译包安装: 可以从官网下载 OpenCV 的安装包,编译后使用;也可以直接使用第三方提供的预编译包 安装。显然后者不需要执行编译步骤,更便捷。选择由 PyPI 提供的 OpenCV 安装包,可以在 https://py…

010-新手如何建立一个属于自己的图像处理FPGA/ZYNQ框架(自己的用着才舒服,内容非常全面!)

文章目录 前言一、图像处理框架二、图像采集输入1.常用视频流格式:Rgb565/Bayer1.RGB565数据流格式2.Bayer阵列数据流格式 2.图像预处理:时钟域同步/去马赛克/色彩空间转换/滤波1.时钟域同步2.图像去马赛克化3.色彩空间转换4.滤波 三、图像算法处理1.图像…

《世界之外》提前开测,网易打响国乙大战

1月18日,国乙市场迎来了一场大战。 原定于1月26日开服的网易新乙游《世界之外》,突然宣布在1月18日进行不删档、不限量测试,从某种意义上来说,其实就等同于提前公测。 而同一天开服的还有叠纸的全新3D乙游《恋与深空》&#xff…

【Redis】基于Token单点登录

基于Token单点登录 获取验证码 流程图 #mermaid-svg-DLGHgCofEYXVSmI5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DLGHgCofEYXVSmI5 .error-icon{fill:#552222;}#mermaid-svg-DLGHgCofEYXVSmI5 .error-text{f…

unocss+iconify技术在vue项目中使用20000+的图标

安装依赖 npm i unocss iconify/json配置依赖 vue.config.js文件 uno.config.js文件 main.js文件 使用 <i class"i-fa:user"></i> <i class"i-fa:key"></i>class名是 i- 开头&#xff0c;跟库名:图标名&#xff0c;那都有什么库…

Springboot+vue项目部署所有遇到的坑

https://flowus.cn/siriusx/share/0a818075-372b-4948-88af-c75c1d10ceab项目地址及笔记 Spring Boot3VUE3前后端分离项目基于Jwt的校验方案 环境搭建 安装jdk17 安装mysql server https://ubuntu.com/server/docs/databases-mysql 将服务器root账号由系统验证改为密码验证…

c语言-结构体内存对齐

文章目录 前言一、结构体内存对齐总结 前言 本篇文章介绍结构体内存对齐。 一、结构体内存对齐 定义两个结构体&#xff1a; struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; }; //输出结构体大小 int main() {printf("%u\n", sizeof(st…

提升开发效率,Fiddler Everywhere for Mac助您解决网络调试难题

在现代软件开发中&#xff0c;网络调试是一个不可或缺的环节。无论是前端开发还是后端开发&#xff0c;我们经常需要对网络请求进行监控和调试&#xff0c;以便及时发现并解决问题。而Fiddler Everywhere for Mac作为一款强大的网络调试工具&#xff0c;能够帮助开发者提升工作…

【01】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在天地图上&#xff0c;天地图坐标系web墨卡托。 效果图&#xff1a; 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路&#xff1a; 需要制作一个和天地图比例…

视觉检测系统:工厂生产零部件的智能检测

在工厂的生产加工过程中&#xff0c;工业视觉检测系统被广泛应用&#xff0c;并且起着重要的作用。它能够对不同的零部件进行多功能的视觉检测&#xff0c;包括尺寸和外观的缺陷。随着制造业市场竞争越来越激烈&#xff0c;对产品质检效率的要求不断提高&#xff0c;传统的人工…

EMQX安装和Java使用

一、EMQX介绍 EMQX是大规模分布式MQTT消息服务器&#xff0c;可以高效可靠连接海量物联网设备&#xff0c;实时处理分发消息与事件流数据&#xff0c;助力构建关键业务的物联网与云应用。EMQX 作为物联网应用开发和物联网平台搭建必须用到的基础设施软件&#xff0c;主要在边缘…

田园好比一幅美丽的画

一望无垠的麦田&#xff0c;清新的空气&#xff0c;茂密的小树林&#xff0c;这一切都呈现在田园里。 清晨&#xff0c;东方刚刚泛起了鱼肚白&#xff0c;一切都雾蒙蒙的&#xff0c;仿佛给大地披上了一层薄薄的轻纱&#xff0c;大地在沉睡当中&#xff0c;小花沉静在美梦中&am…

ARM64汇编01 - 环境搭建

arm官方手册 由于市面上几乎没有arm相关书籍&#xff0c;所以推荐看官方文档。虽然是英文的&#xff0c;看不下去也要硬看&#xff0c;毕竟搞这方面的还是得有啃英文文档/书籍的能力。 另外&#xff0c;再推荐一个翻译网站&#xff1a;https://www.deepl.com/zh/translator …

git报错:Failed to connect to github.com port 443: Timed out

git提交报错 git报错&#xff1a;Failed to connect to github.com port 443: Timed out解决办法 使用ping github.com 发现ping不通修改hosts文件&#xff0c;让主机跳过DNS服务器 直接根据hosts配置信息进行替换域名在ipaddress.com查询Github真实IP地址 打开hosts文件 添加…

【Java SE】基础知识回顾——【13.线程 | 同步】

【线程 同步】 第一章 Thread 1.1 Thread类 /*** author 270* 获取线程的名称&#xff1a;* 1.使用Thread中的方法getName()* String getName() 返回该线程的名称* 2.可以获取到当前正在执行的线程&#xff0c;使用线程中的方法getName()获…

【年度TikTok电商数据解析】火遍全网!出单率超高!这个产品会成为2024年卖家新宠吗?

随着大众对口腔健康越来越重视&#xff0c;消费者对漱口水、牙线、口腔清新剂等口腔卫生产品形成深度依赖。 当然&#xff0c;这一趋势对于我们TikTok爆款商机打造息息相关。 然而&#xff0c;在目前的口腔护理赛道&#xff0c;高露洁、宝洁、飞利浦等巨头盘踞&#xff0c;掌握…

Spring重要知识点

一、Spring中相关概念 1.IOC 控制反转 IoC&#xff08;Inverse of Control:控制反转&#xff09;是⼀种设计思想&#xff0c;就是将原本在程序中⼿动创建对象的控制权&#xff0c;交由Spring框架来管理。IoC 在其他语⾔中也有应⽤&#xff0c;并⾮ Spring 所独有。 IoC 容器…

政务服务场景为何要打造AI交互数字人?

随着Chat GPT兴起&#xff0c;越来越多服务场景通过AI交互数字人以多模态交互形式实现人机交互。如近日昆山市档案馆推出了AI交互数字人“昆兰”&#xff0c;数字人设置于市档案馆一楼大厅入口处&#xff0c;市民可以与AI交互数字人进行实时问答交流&#xff0c;了解总书记关于…