Gin 中使用 base64Captcha 生成图形验证码分布式架构-redis方案

Gin 中使用 base64Captcha 生成图形验证码分布式架构-redis方案

多台服务器上,分布式,

base64Captcha 的数据存储到 Redis 中

redis地址:github.com/go-redis/redis/v8
go get -u  github.com/go-redis/redis/v8

连接redis: redisCore.go

package models


import (
	"context"
	"github.com/go-redis/redis/v8"
)


//全局定义
var (
	RedisDb *redis.Client
)
//创建 redis 链接
func init() {
	var ctx = context.Background()
	RedisDb = redis.NewClient(&redis.Options{
		Addr: "111.229.91.20:6379",
		Password: "chengqiang", // no password set
		DB: 0, // use default DB
		 })
	_, err := RedisDb.Ping(ctx).Result()
	if err != nil {
		//连接失败
		println(err)
	} }

配置用于存验证码的redis仓库:redisStore.go

package models

import (
	"context"
	"fmt"
	"time"
)

var ctx = context.Background()

const CAPTCHA = "captcha:"

type RedisStore struct {
}

//实现设置captcha的方法
func (r RedisStore) Set(id string, value string) error {
	key := CAPTCHA + id
	//time.Minute*2:有效时间2分钟
	err := RedisDb.Set(ctx, key, value, time.Minute*2).Err()

	return err
}

//实现获取captcha的方法
func (r RedisStore) Get(id string, clear bool) string {
	key := CAPTCHA + id
	val, err := RedisDb.Get(ctx, key).Result()
	if err != nil {
		fmt.Println(err)
		return ""
	}
	if clear {
		//clear为true,验证通过,删除这个验证码
		err := RedisDb.Del(ctx, key).Err()
		if err != nil {
			fmt.Println(err)
			return ""
		}
	}
	return val
}

//实现验证captcha的方法
func (r RedisStore) Verify(id, answer string, clear bool) bool {
	v := RedisStore{}.Get(id, clear)
	//fmt.Println("key:"+id+";value:"+v+";answer:"+answer)
	return v == answer
}

验证码中进行调用库: captcha.go

//配置RedisStore RedisStore实现base64Captcha.Store的接口
var store  base64Captcha.Store = RedisStore{}
posted @ 2021-11-01 12:05  成强  阅读(833)  评论(2编辑  收藏  举报