Redis中获取的验证码与前端值类型不一致如何解决?

redis中获取的验证码与前端值类型不一致如何解决?

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

(0)
上一篇 2025年3月30日 09:00:00
下一篇 2025年3月30日 09:00:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论