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

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.hqwc.cn/news/23255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程(三)---深入理解进程地址空间

目录 地址空间的划分及验证 所谓的地址空间是内存吗? 一种奇怪的现象(虚拟地址的引入) 什么是进程地址空间? 我们平常访问到的内存是物理内存吗? 深入理解区域划分 再谈奇怪的现象 fork()中为什么一个变量可以同时保存两个不同的值 …

单链表基本操作(java)

单链表 一.自定义链表类二.自定义节点类三.链表中的基本方法1.头插法2.尾插法3.在任意位置插入4.删除第一次的关键字为key的节点5.删除所有关键字为key的元素6.是否包含关键字key7.获取链表长度8.遍历节点并输出9.清空链表 一.自定义链表类 public class MySingleList {Node h…

121、仿真-基于51单片机8路温度 ds18b20多路温度传感器检测仿真设计(Proteus仿真+程序+原理图+参考论文+任务书+流程图等)

摘 要 随着社会经济的高速发展和科技水平的不断进步,温度监控器的运用范围越来越广泛,也渐渐地发展到了核变站的温度监控。温度与人们的生活生产密切相关,比如在核变站的环境下,对温度的监控更是必不可少的,不但能保…

【Vue】 在 vue 中使用 iframe 挂载 html 文件

文章目录 首先需要将要挂载的html文件放到public 文件夹中 路径的引用形式 <iframe ref"sheet" src"/luckysheet.html" width"100%" height"100%"></iframe>通过绑定 ref 获取到 iframe&#xff0c;data为我需要传递的数…

【设计模式】23种设计模式——单例模式(原理讲解+应用场景介绍+案例介绍+Java代码实现)

单例模式(Singleton) 介绍 所谓类的单例设计模式&#xff0c;就是采取一定的方法&#xff0c;保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法&#xff08;静态方法&#xff09;。比如Hibernate的Sessio…

Mysql数据库之存储引擎

目录 一、存储引擎概念 二、MyISAM存储引擎 1.特点详解 2.适用生产环境 三、InnoDB存储引擎 1.特点详解 2.适用生产环境 四、数据库存储引擎操作 1.查看数据库支持的存储引擎 2.查看数据库存储引擎 3.修改数据库表的存储引擎 五、行锁和表锁 1.InnoDB使用行锁和表…

人工智能-神经网络

目录 1 神经元 2 MP模型 3 激活函数 3.1 激活函数 3.2 激活函数作用 3.3 激活函数有多种 4、神经网络模型 5、神经网络应用 6、存在的问题及解决方案 6.1 存在问题 6.2 解决方案-反向传播 1 神经元 神经元是主要由树突、轴突、突出组成&#xff0c;树突是从上面接收很多…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

opencv-07-感兴趣区域(ROI)

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区 域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

将Xvfb和Chrome封装到Docker镜像中并执行java程序

docker pull ubuntu:22.04docker run -itd --net host -v /home/:/home ubuntu:22.04 进入容器 docker exec -it 8203e24ed bash apt-get update apt-get install xvfb apt-get install chromium-browser apt install chromium-chromedriver apt install openjdk-11-jdk …

Java Stream流详解

本文目录 学习目标中间操作 Filter(过滤)Map(转换)Sorted(排序)Distinct(去重)Limit(限制)Skip(跳过)Peek(展示)终止操作 forEach(循环)Collect(收集)Count(计数)Reduce(聚合)AnyMatch(任意匹配)AllMatch(全部匹配)NoneMatch(无匹配)使用Stream流的优缺点&#xff1a; 优点&am…

elementUI表格勾选框判断选择相同的内容才能进行后续逻辑处理;否则拦截提示

需求是&#xff1a; 可多选需满足条件&#xff1a;同一个年级、同一个分数&#xff1b; 不满足条件给出提示&#xff1a;请选择同一个年级 、分数的学生 1、先对勾选数据进行赋值 /** 表格复选框勾选 */handleSelectionChange(val) {console.log(val)this.tableSelectArr va…