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 }