go使用redis实现验证码

举报
yd_254179665 发表于 2025/07/23 11:46:33 2025/07/23
【摘要】 可以使用go-redis库来与Redis进行交互go get -u github.com/go-redis/redis/v8在Go代码中,我们需要创建一个Redis客户端实例,并连接到Redis服务器。package mainimport ( "context" "fmt" "time" "github.com/go-redis/redis/v8")var ctx =...

可以使用go-redis库来与Redis进行交互

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

在Go代码中,我们需要创建一个Redis客户端实例,并连接到Redis服务器。

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/go-redis/redis/v8"
)

var ctx = context.Background()

func main() {
    // 创建Redis客户端
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379", // Redis服务器地址
        Password: "",               // 密码(如果需要)
        DB:       0,                // 使用的数据库
    })

    // 测试连接
    _, err := rdb.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }

    fmt.Println("Connected to Redis successfully")
}

接下来,我们编写一个函数来生成验证码并将其保存到Redis中。

import (
    "crypto/rand"
    "encoding/base64"
    "fmt"
    "time"

    "github.com/go-redis/redis/v8"
)

func generateCaptcha() string {
    b := make([]byte, 32)
    _, err := rand.Read(b)
    if err != nil {
        panic(err)
    }
    return base64.URLEncoding.EncodeToString(b)
}

func saveCaptcha(rdb *redis.Client, key string, captcha string, expiration time.Duration) error {
    return rdb.Set(ctx, key, captcha, expiration).Err()
}

func main() {
    // 创建Redis客户端
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // 测试连接
    _, err := rdb.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }

    fmt.Println("Connected to Redis successfully")

    // 生成验证码
    captcha := generateCaptcha()
    fmt.Println("Generated Captcha:", captcha)

    // 保存验证码到Redis
    key := "captcha:123456" // 假设123456是用户的唯一标识
    expiration := 5 * time.Minute // 验证码有效期5分钟
    err = saveCaptcha(rdb, key, captcha, expiration)
    if err != nil {
        panic(err)
    }

    fmt.Println("Captcha saved to Redis successfully")
}

最后,我们编写一个函数来验证用户输入的验证码是否正确。

func verifyCaptcha(rdb *redis.Client, key string, userCaptcha string) (bool, error) {
    storedCaptcha, err := rdb.Get(ctx, key).Result()
    if err == redis.Nil {
        return false, nil // 验证码不存在
    } else if err != nil {
        return false, err
    }

    return storedCaptcha == userCaptcha, nil
}

func main() {
    // 创建Redis客户端
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // 测试连接
    _, err := rdb.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }

    fmt.Println("Connected to Redis successfully")

    // 生成验证码
    captcha := generateCaptcha()
    fmt.Println("Generated Captcha:", captcha)

    // 保存验证码到Redis
    key := "captcha:123456"
    expiration := 5 * time.Minute
    err = saveCaptcha(rdb, key, captcha, expiration)
    if err != nil {
        panic(err)
    }

    fmt.Println("Captcha saved to Redis successfully")

    // 验证验证码
    userCaptcha := "your_user_input" // 假设这是用户输入的验证码
    isValid, err := verifyCaptcha(rdb, key, userCaptcha)
    if err != nil {
        panic(err)
    }

    if isValid {
        fmt.Println("Captcha is valid")
    } else {
        fmt.Println("Captcha is invalid")
    }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。