功能优化:当用户在验证码失效时无法接受验证码解决方案

文章介绍了如何优化验证码功能,当用户在验证码失效但还在指定的30分钟时间内未验证时,系统会发送与之前相同的验证码。如果超过时间限制或已验证,则生成新的验证码。优化涉及检查数据库中的验证码状态和过期时间,并相应地更新和发送验证码。
摘要由CSDN通过智能技术生成

功能优化:当用户在验证码失效时无法接受验证码解决方案

在验证码的表中定义了time(是否经过验证)属性,我们通过time为0或者1来判断用户在发送验证码的期间是否有验证,

如果没有验证,并且验证码时间在指定时间之内(我们这里定义30min),那么再次发送的验证码将于之前发送的验证码相同

其他情况都重新生成验证码并发送

// 获取验证码
// 检查是否进行验证过,用于重新发送验证码时调用,检查用户是否验证过
// 如果没有就发送与原来相同的验证码,否则就发送新验证码
func GetuVerification(db *sql.DB, email string) int {

 // 查询验证码是否正确
 var expirationTime int64 //储存过期时间

 verification, t := 0, 0

 err := db.QueryRow("SELECT time, Verification, ExpirationTime FROM VerificationCode WHERE Email = ?", email).Scan(&t, &verification, &expirationTime)
 //当没有验证码发送记录||已经验证过||超出时间限制(因为expirationTime为过期时间,为生成的5分钟之后,所以加上25分钟正好30分钟)  则需要重新生成验证码
 if err != nil || t == 1 || expirationTime+25*60 < time.Now().Unix() {
  rand.Seed(time.Now().UnixNano())
  // 生成100000到999999之间的随机数,作为验证码
  return rand.Intn(899999) + 100000

 } else {
  return verification
 }
}

需要发送验证码的响应函数更改

r.POST("/login1"func(ctx *gee7.Context) {
  data := funcmod.Login1data{}
  //读取用户传入的json数据
  err = ctx.Getjson(&data)
  if err != nil {
   ctx.Returnfunc(410"解析数据错误"+err.Error(), nil)
   return
  }
  if funcmod.Validatedata(data.Email) {
   ctx.Returnfunc(402"email不合理,请规范填写数据"nil)
  }
  //验证图片验证码是否正确
  err = funcmod.Verifypiccode(db, data.PicID, data.PicCode)
  if err != nil {
   ctx.Returnfunc(401"验证码错误"+err.Error(), nil)
   return
  }
  _, err = funcmod.GetuserId(db, data.Email)
  if err == nil {
   ctx.Returnfunc(410"账号已经注册了"nil)
   return
  }

  verification := funcmod.GetuVerification(db, data.Email)
  //储存验证码到数据库
  err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
   Email:        data.Email,
   Verification: verification})
  if err != nil {
   ctx.Returnfunc(401"发送失败,稍后再试"+err.Error(), nil)
   return
  }
  //发送验证码
  err = funcmod.SendEmail(dailer, data.Email, verification)
  if err != nil {
   ctx.Returnfunc(401"发送失败"+err.Error(), nil)
   return
  }

  ctx.Returnfunc(200"ok"nil)
 })
  
  // 登录第一步:1. 图片验证,;2. 发送邮件验证码
func SigninByEmail1(db *sql.DB, dialer *gomail.Dialer) gee7.HandlerFunc {
 return func(ctx *gee7.Context) {
  data := funcmod.Signupbyemail1{}
  //读取用户传入的json数据
  err := ctx.Getjson(&data)
  if err != nil {
   ctx.Returnfunc(410"解析数据错误"+err.Error(), nil)
   return
  }
  if funcmod.Validatedata(data.Email) {
   ctx.Returnfunc(402"email不合理,请规范填写数据"nil)
  }
  //验证图片验证码是否正确
  err = funcmod.Verifypiccode(db, data.PicID, data.PicCode)
  if err != nil {
   ctx.Returnfunc(401"验证码错误"+err.Error(), nil)
   return
  }
  _, err = funcmod.GetuserId(db, data.Email)
  if err != nil {
   ctx.Returnfunc(410"账号未注册注册,请先注册"nil)
   return
  }
  //获取验证码函数
  verification := funcmod.GetuVerification(db, data.Email)
  //储存验证码到数据库
  err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
   Email:        data.Email,
   Verification: verification})
  if err != nil {
   ctx.Returnfunc(401"发送失败,稍后再试"+err.Error(), nil)
   return
  }
  //发送验证码
  err = funcmod.SendEmail(dialer, data.Email, verification)
  if err != nil {
   ctx.Returnfunc(401"邮箱错误"+err.Error(), nil)
   return
  }
  ctx.Returnfunc(200"ok", gee7.H{
   "msg""ok",
  })
 }
}




// 验证改密第一步:1. 图片验证,;2. 发送邮件验证码
func ResetpaswByEmail1(db *sql.DB, dialer *gomail.Dialer, signinlest SignInList) gee7.HandlerFunc {
 return func(ctx *gee7.Context) {
  data := ResetpaswbyemailData1{}
  //读取用户传入的Returnfunc数据
  err := ctx.Getjson(&data)
  if err != nil {
   ctx.Returnfunc(410, err.Error(), nil)
   return
  }
  if signinlest[data.IDcode] == nil {
   ctx.Returnfunc(402"非法访问"nil)
   return
  }
  ctx.Userid = signinlest[data.IDcode].ID
  //验证图片验证码是否正确
  err = Verifypiccode(db, data.PicID, data.PicCode)
  if err != nil {
   ctx.Returnfunc(401"图片验证码错误"+err.Error(), nil)
   return
  }
  // 验证成功:获取用户邮箱
  emial, err := GetuserEmail(db, signinlest[data.IDcode].ID)
  if err != nil {
   ctx.Returnfunc(410"未找到邮箱信息,请联系管理员"+err.Error(), nil)
  }
  verification := GetuVerification(db, emial)
  //储存验证码到数据库
  err = InsertVerification(db, &EmailVerificationCode{
   Email:        emial,
   Verification: verification})
  if err != nil {
   ctx.Returnfunc(401"发送失败,稍后再试"+err.Error(), nil)
   return
  }
  //发送验证码
  err = SendEmail(dialer, emial, verification)
  if err != nil {
   ctx.Returnfunc(401"邮箱错误"+err.Error(), nil)
   return
  }
  ctx.Returnfunc(200"ok"nil)
 }
}

示例: alt 由于我的验证码没有使用且在时间限制内,所以两次验证码是相同的

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值