GOLANG进阶:govalidator过滤器,MD5,JWT身份验证,redis

news2024/11/26 4:25:59

1.govalidator过滤器:类似于正则匹配,主要放在结构体注释部分,有些验证没有,需要自己替换(把required部分替换成正则表达式)

引入资源包(两种方式):

go get github.com/asaskevich/govalidator

go get gopkg.in/asaskevich/govalidator.v10

代码(可以写在结构体中,也可以单独使用):

type User struct {
    gorm.Model
    USERNAME string `json:"name" validate:"min=0,max=35"`
    PASSWOR string `validate:"required"`
    SEX int8  `validate:"required"`
    PHONE string  `validate:"required"`
    EMAIL string `validate:"required,email"`
    ADDRESS string `json:"address" validate:"lte=0,gte=90"`
    STATUS int8 `validate:"required"`
    LOGINTIME time.Time `validate:"required"`
    LOGINIP string `validate:"required"`
    LOGOUTTIME time.Time `validate:"required"`
}

2.MD5加密:不可逆加密(框架内置,不需要额外引入包)

//小写版本
func Md5string(str string)  string{
    //初始化
    h := md5.New()
    //转换成文件流
    h.Write([]byte(str))
    temp :=h.Sum(nil)
    //输出
    return hex.EncodeToString(temp)
}

//大写版本
func MD5string(str string)  string{
    //初始化
    h := md5.New()
    //转换成文件流
    h.Write([]byte(str))
    temp :=h.Sum(nil)
    //输出
    return strings.ToUpper(hex.EncodeToString(temp))
}

3.jwt结构(JSON Web令牌):它是一个签名的JSON对象,可以做一些验证类的事情,可以看成是服务器发出的令牌,每次有新请求就会去验证(单点登录),如果是验证错误直接退出当前流程

组成部分

1.Header(标头)

2.Payload(有效载荷 )

3.Signature(签名)

 

引入资源包

go get -u github.com/dgrijalva/jwt-go

代码:

import (
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "github.com/gin-gonic/gin"
    "time"
)

type Claim struct {
    USERNAME string `josn:"userbane" validate:"required"`
    PASSWORD string `josn:"password" validate:"required"`
    //jwt标准结构
    jwt.StandardClaims
}

//密码(自定义:最好是写在配置文件,配合redis取用)
var jwtkey = []byte("local")

func main()  {
    //初始化
    g := gin.Default()
    g.GET("indexs",Indexs)
    g.GET("indexparse",Parsetoken)
    g.Run(":8080")
}

func Indexs(ctx *gin.Context)  {
    //获取参数
    uarname := ctx.Query("uarname")
    password := ctx.Query("password")
    expireTime := time.Now().Add(7 * 24 * time.Hour)

    //赋值
    claims := &Claim{
        USERNAME: uarname,
        PASSWORD: password,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expireTime.Unix(), //过期时间
            IssuedAt:  time.Now().Unix(),//起始时间
            Issuer:    "127.0.0.1",  // 签名颁发者
            Subject:   "token", //签名主题
        },

    }
    //生成秘钥
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    //获取秘钥
    tokenString, _ := token.SignedString(jwtkey)
    ctx.JSON(200,gin.H{
        "ping":tokenString,
    })
}

func Parsetoken(ctx *gin.Context)  {
    //接收参数
    tokenst := ctx.GetHeader("Authorization")
    //判断参数是否为空
    if tokenst=="" {
        ctx.JSON(400,gin.H{
            "ping":"参数错误",
        })
    }
    //解码
    token, claims, err := ParseToken(tokenst)
    if err != nil || !token.Valid {
        ctx.JSON(400, gin.H{"ping":"秘钥错误"})
        ctx.Abort()//调过剩余的方法,直接返回
        return
    }

    //打印结构体(解码回传数据)
    fmt.Println(claims)
}

//解码方法
func ParseToken(tokenString string)  (*jwt.Token,*Claim,error){
    //初始化结构体
    Claims := &Claim{}
    //内置解码方法
    token, err := jwt.ParseWithClaims(tokenString, Claims, func(token *jwt.Token) (i interface{}, err error) {//匿名方法(可以分开写,也可以按照现在这样)
        return jwtkey, nil
    })
    return token, Claims, err
}

4.redis:非关系型数据库(具体了解可以看博主之前的文章)

引入资源包

go get -u github.com/go-redis/redis

//代码示例

import (
   "fmt"
   "github.com/go-redis/redis"
   "github.com/spf13/viper"
)

func Initredis() (errreback error) {
   //vip获取配置
   viper.SetConfigName("app")
   viper.AddConfigPath("config")
   err := viper.ReadInConfig()
   if err != nil {
      fmt.Println("redis参数配置错误")
   }

   //链接参数
   Rdb := redis.NewClient(&redis.Options{
      //链接地址
      Addr:     viper.GetString("redis.local") + ":" + viper.GetString("redis.port"),
      //链接密码
      Password: viper.GetString("redis.password"),
      //默认数据库
      DB:0,
      //Redis连接池大小
      PoolSize: 10,
      //最大重试次数
      MaxRetries: 3,
   })

   //链接
   _, err = Rdb.Ping().Result()
   if err != nil {
      fmt.Println("redis链接错误")
   }

   //返回值
   return nil
}

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

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

相关文章

ubuntu重启后,docker容器中的mysql怎么重启

1、第一次安装的时候,参考使用docker安装mysql主从集群_docker mysql主从集群_veminhe的博客-CSDN博客 这篇博客操作的。 2、但是突然有一天,我的腾讯云主机被迫重启了,发现docker容器中的mysql挂掉了 3、搜资料看下 参阅了Docker启动mysq…

css之:is()、:where()和:has()伪元素的运用、使用、important

文章目录 简介1、:is()2、:where()3、:has() 简介 :is()、:where()和:has()伪元素是CSS中用于样式化元素的非常强大的工具。它们是在CSS选择器Level4规范中引入的。它们允许我们将样式应用于符合特定条件的任何元素,例如元素的类型、元素的位置和元素的后代。 1、:i…

科研热点|国自然会评季:地方高校申请国家基金难度有多大?

2022年国自然放榜后,一位评审专家的函评意见引发关注。 这位专家在一份函评意的第四部分其他建议中写到: 地方高校的老师不容易。申请人发表了不少好论文,但从未获得过基金支持,应该支持这种在没有项目和条件下还很好开展了研究…

Kubernetes中Pod的升级和回滚

Kubernetes中Pod的升级和回滚 本文说说 Pod 的升级和回滚问题。 当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有 Pod,然后下载新版本镜像并创建新的 Pod。如果集群规模比较大,则这个工作变成了一个挑战,而且…

【Linux】 Linus世界,WIndows VS Linux

文章目录 前言WindowsLinux操作系统Windows VS Linux收费情况技术支持安全性开源 区别 前言 在电脑世界有两种十分常见的电脑操作系统——Linux与和Windows,相信对电脑有一定了解的人对它们一定并不陌生!但是在我们的使用过程中,是否有什么事…

大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?

1、说明 最近公司升级框架,由原来的spring framerwork 3.0升级到5.0,然后写代码的时候突然发现idea在属性注入的 Autowired 注解上给出警告提示,就像下面这样的,也挺懵逼的,毕竟这么写也很多年了。 Field injection i…

leetcode 147.对链表进行插入排序

⭐️ 题目描述 🌟 leetcode链接:对链表进行插入排序 思路与图解: 遍历链表,当前结点依次与前面的结点比较,选择插入位置。每次与前面的结点比较需要从头开始比较,所以定义一个 tempHead 指针,…

Python实现PSO粒子群优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

CopyRE关系抽取

CopyRE 模型包括编码器和解码器两部分 编码器:将输入的句子(源句子)转换为固定长度的语义向量 解码器:读取该矢量并直接生成三元组 Encoder 编码器使用Bi-RNN对输入句子进行编码。 Decoder 解码器会直接生成三元组。 1、 解码…

仅用js代码实现模态框

很多时候我们经常会用ui框架实现模态框的使用,但是,如果哪一天告诉我们,如何仅用js代码实现一个模态框该怎么办呢? 这里就要用到很多js中的基础方法运用了,我们先看如下代码 var logDiv document.createElement(&quo…

Java版本电子招标采购系统源码:—实现多寻源比价,风险预警

营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…

vue2跨组件传值、透明传输($attrs 和 $listeners )

当在 Vue.js 组件中使用 $attrs 和 $listeners 时,它们提供了一种方便的方式来处理传递给组件的属性和事件监听器。 1.$attrs 是一个对象,包含了父组件传递给当前组件但未被当前组件声明的 props。这对于实现“透明传输”非常有用。 2.$listeners 也是…

EMQ 联合英特尔、云轴科技 ZStack 推出泛工业物联网联合解决方案

近日,EMQ 携手英特尔与云轴科技 ZStack 推出泛工业物联网联合解决方案,基于云原生超融合,在挖掘生产数据价值的同时有效降低综合建设成本,为用户提供一站式数据链路及 IT 基础设施解决方案。 工业能耗大户面临的关键挑战 工业正迈入一个全新的物联网时代,海量数据计算需求涌现…

实验三 交换机基本配置

文章目录 实验目的实验原理实验内容实验总结 实验目的 掌握 Cisco Packet Tracer 模拟软件的基本使用方法;掌握交换机的基本配置方法和命令;掌握交换机 telnet 配置方法;理解交换机不同配置视图的作用; 实验原理 (一…

Linux Shell 脚本编程学习之【第1章 Shell脚本编程概述】

《第1章 Shell脚本编程概述》 1 Linux简介2 Shell 简介3 Linux登录方式4 脚本编程优势4.1 shell脚本编程优势 5 shell脚本基本元素6 执行shell脚本 1 Linux简介 1991年芬兰赫尔辛基大型学生Linus Torvals开发了Linux内核。 2 Shell 简介 1、Shell是一种具备特殊功能的程序。…

【Java基础教程】(十)面向对象篇 · 第四讲:解析Java中的this关键字,引用传递印象加强:理解与实践~

Java基础教程之面向对象 第四讲 本节学习目标1️⃣ this 关键字1.1 调用本类属性1.2 调用本类方法1.3 表示当前对象 2️⃣ 引用传递2.1 基本概念2.2 实际应用 🌾 总结 本节学习目标 掌握关键字this的特征以及使用;掌握引用传递分析思维; …

UMS攸信技术是厦门市工业互联网园区建设的积极参与者与推动者,为数字化转型与工业互联网建设注入新动力

7月6日,厦门市工业互联网一体化进园区“百城千园行”活动第二站走进同安区常青藤科技园,与现场企业共话产业数字化创新发展。 本次活动以“工赋园区 数智未来”为主题,由厦门市工业和信息化局、厦门市同安区人民政府、厦门市同安区工业和信息…

809. 最小公倍数

链接: 链接 题目: 输入两个整数 aa 和 bb,请你编写一个函数,int lcm(int a, int b),计算并输出 aa 和 bb 的最小公倍数。 输入格式 共一行,包含两个整数 aa 和 bb。 输出格式 共一行,包含一个整…

【ELK集群】

ELK集群部署环境准备 配置ELK日志分析系统 192.168.108.67 elk-node1 es、logstash、kibana 192.168.108.189 elk-node2 es、logstash 192.168.108.32 apache logstash 三台虚拟机配置调高 三台机关闭防火墙 改名 1、2台机配置hosts解析文件 1,2台都用系…

Web入门-SpringBoot

SpringBootweb快速入门 需求:使用Spring Boot开发一个web项目,浏览器发起请求/hello后,给浏览器返回字符串”Hello World~“开发步骤 创建SpringBoot工程,并勾选web开发的相关依赖 根据自己idea的版本的不同创建模块即可 &#x…