
Redis与前端验证码类型不匹配问题及解决方案
使用github.com/gomodule/redigo/redis库操作Redis时,经常遇到从Redis获取的验证码与前端提交的验证码类型不一致的问题,导致验证失败。本文分析一个典型案例并提供解决方案。
问题描述:
后端将验证码(例如"8414")存储在Redis中,键为邮箱地址(例如:"123@qq.com")。前端提交邮箱和验证码进行验证。后端使用redigo库获取验证码并与前端值比较,但始终不相等。打印结果显示,Redis获取的值为[]byte类型,转换为字符串后包含双引号("8414"),而前端验证码字符串不包含双引号(8414)。
立即学习“前端免费学习笔记(深入)”;
代码片段:
email := c.query("email")
code := c.query("code")
str, _ := gredis.get(email)
fmt.Println(str, string(str), "", []byte(code+""), code)
if string(str) != code { // 修改后的比较方式
appg.failjson(e.error, "验证码错误")
return
}gredis.get函数实现:
// Get get a key
func Get(key string) (interface{}, error) {
conn := RedisConn.Get()
defer conn.Close()
reply, err := redis.Bytes(conn.Do("GET", key))
if err != nil {
return nil, err
}
// 原代码中json.Unmarshal此处不必要,且可能导致错误
// var reply2 interface{}
// err = json.Unmarshal(reply, &reply2)
// if err != nil {
// return nil, err
// }
return reply, nil // 直接返回[]byte
}问题根源:
redis.Bytes函数将Redis返回的字节数组直接转换为[]byte类型。fmt.Println输出[]byte类型时会包含双引号。 直接将[]byte转换为字符串再与前端字符串比较,导致结果错误。
解决方案:
无需使用json.Unmarshal。 redis.Bytes已经正确地获取了字节数组。 关键在于比较方式的修改。 直接将前端的code (string类型)与后端获取的[]byte类型进行比较是不正确的。 应该将[]byte转换为string后,再进行字符串比较,并且去除多余的空格。
修改后的代码如下:
email := c.query("email")
code := c.query("code")
str, _ := gredis.get(email)
redisCode := strings.TrimSpace(string(str[:])) // 转换并去除空格
fmt.Println(str, redisCode, "", code)
if redisCode != code {
appg.failjson(e.error, "验证码错误")
return
}通过去除多余的空格并进行正确的类型转换和比较,可以有效解决这个问题,确保验证码验证的准确性。 此方案避免了不必要的json.Unmarshal操作,简化了代码,并提高了效率。 需要注意的是,此方案假设Redis中存储的是纯数字字符串,如果存储的是其他类型数据,需要根据实际情况调整类型转换方式。
以上就是Redis中获取的验证码与前端值类型不一致如何解决?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号