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 keyfunc 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中获取的验证码与前端值类型不一致如何解决?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3151241.html