golang 验证码操作


由于在项目中有时候需要验证码来进行前端验证

所以就在github上找两个一个开源的golang验证码项目

项目地址:https://github.com/dchest/captcha

加载到项目中 :

go get github.com/dchest/captcha

验证码使用:package tool

 import ( "bytes"
    "encoding/base64"
    "github.com/dchest/captcha" ) const ( DefaultLen = 6   //验证码默认长度 6位数字
    DefaultWidth  = 200 // 验证码默认宽度
    DefaultHeight = 100 //验证码默认高度
) type CaptchaTool struct { CaptchaLen int `json:"captcha_len"`    //验证码长度
    CaptchaWidth  int `json:"captcha_width"`  //验证码图片宽度
    CaptchaHeight int `json:"captcha_height"` //验证码图片高度
} // RedisStore 由于服务器是负载均衡,所以需要用redis来替代默认的store 如果是单台服务器,不需要redis来管理
var redisStore *RedisStore type RedisStore struct { ExpireTime int //过期时间 秒
} func (rs *RedisStore) Set(id string, digits []byte) { err := cache.SetStringCache(id, string(digits), rs.ExpireTime) if err != nil { return } return }
func (rs
*RedisStore) Get(id string, clear bool) (digits []byte) { bs, err := cache.GetStringCache(id) if err != nil { fmt.Println("error:",err)return } return []byte(bs) } // GetCaptcha 获取一个验证码 imageData 存放base64之后的图片信息 func (c *CaptchaTool) GetCaptcha() (captchaId string, imageData string, err error) { captchaData := verifyParma(c) //设置redis为默认保存数据的地方 600秒过期 如果只是单台服务期,这两行不需要加载 redisStore = &RedisStore{ExpireTime: 600} captcha.SetCustomStore(redisStore) captchaId = captcha.NewLen(captchaData.CaptchaLen) //设置验证码长度 var image bytes.Buffer //图片信息保存在bytes.buff里面 err = captcha.WriteImage(&image, captchaId, captchaData.CaptchaWidth, captchaData.CaptchaHeight) imageData = base64.StdEncoding.EncodeToString([]byte(image.String())) if err != nil { return } return } // VerifyCaptcha 验证是否正确 digits 前端传过来的数字字符串验证码 // 验证成功删除redis_key func (c *CaptchaTool) VerifyCaptcha(captchaId string, digits string) bool { res := captcha.VerifyString(captchaId, digits) if res == false { return false } go func() { _, _ = cache.DEL(captchaId) }() return true } //验证参数 func verifyParma(captcha *CaptchaTool) (reply *CaptchaTool) { reply = new(CaptchaTool) reply = captcha if captcha.CaptchaLen <= 0 { reply.CaptchaLen = DefaultLen } if captcha.CaptchaWidth <= 0 { reply.CaptchaWidth = DefaultWidth } if captcha.CaptchaHeight <= 0 { reply.CaptchaHeight = DefaultHeight } return }

使用方式:

    
//获取验证码图片,返回的是base64之后图片码
var captchaTool = tool.CaptchaTool{} captchaId, imageData, err := captchaTool.GetCaptcha() if err != nil { err = status.Errorf(codes.Internal, "生成验证码失败") return }

//对比验证码是否有效
  var captchaTool = CaptchaTool{}
  verifyRes := captchaTool.VerifyCaptcha(captchaId, captchaDigits)
  if verifyRes == false {
      err = status.Errorf(codes.InvalidArgument, "验证码输入错误,请重新输入")
      return
}

 

//cache里面的方法都是操作redis的 CA()是自己定义的ReidsClient连接池

//写入一个字符串cache
func SetStringCache(key string, jsonStr string, expireTime int) (err error) {
_, err = CA().Do("SETEX", key, expireTime, jsonStr)
return err
}

//获取一个字符串cache
func GetStringCache(key string) (res string, err error) {
res = "not_exists"
exists, err := redis.Int(CA().Do("EXISTS", key))

if exists > 0 {
res, err = redis.String(CA().Do("GET", key))
}
return res, err
}
//批量删除keys
func DEL(keys ...string) (int64, error) {
var keySlice []interface{}
for _, key := range keys {
keySlice = append(keySlice, key)
}
return redis.Int64(CA().Do("DEL", keySlice...))
}

前端html页面:

img src属性里面是获取验证码返回的图片内容 需要带上前缀:

<img src="data:image/png;base64,xxxxxxxx">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAP1BMVEUAAABfEXG5a8vGeNhtH39uIIC9b8/Lfd2FN5fNf99SBGSPQaHRg+NRA2N+MJCURqZqHHxeEHDOgOCyZMTGeNjdkxI2AAAAAXRSTlMAQObYZgAABM1JREFUeJzsm4luIj0MgO1KtBwV5Xj/d/01V2I7dg7GLDB/vBJLaSbx5ytOKqBLl5xcr9dXq+Ai1+tGSDrI28lWOLp06fIs+Xq1Ak7ytRWQzXiky6NyOp1erYKLnE4bIfl0EJxlAsHnL/jtPyVOGOMbQBw4pp+fKd/f7iRoifdCXPw9ckBkHvlnKFn5axuOiIfDgek8vX81yt9fG8ngjIOq7eyj15G0DM4b/Tk+ecJBeUyN0pgpcfzE/+qi0tzePnkZyDzQbVlvkIbwn4uzCwt650hNetDRXiTegTpwKJ+C+vH4CyeUcRI/FF2n/BaIE47Dyl5OIVOx+MLln7WMl0/AxSsY/cEsjLHHsgJs7l7WqyC88tCcRNvp9Sd+HjySiS8XrwiSgvGsOWazTs/iz89IQkMKedLjbDK6rjbz/X5/EIWGQj0GCZ/x9SfMxVSN2rJn7HS935tIojnFwaEKZjl2hLgiv2I5znI+BB3SdVeDRBLEJhTqCWU0V02GcHwWDKe0g8BiVmSmMmBidJMUN3ZDuQhfDtSoZiRtHHSicEDVWURGZAJDWQEwvpvPjKT6MpKadqd07AHkKk+TT/dSicuEiqWFo/l5HZAkRcvMNs9gICr2X27YkG9yLC4qOAATJMFH+mK7G4AKWKYeYVlA0hyi2RKfsWa3SdieouQLkMw0y4tA4ZpM4+erQpx/FBzUqralkBdglMZiZHH+JPKq/B+iL6y4C7GFQmQhIsmrdsIgewhhLA1EXIlhSx9FEhIAdrsdj23qClqIaJei+h3lniidwJFDpiyTqfFWhInG2CW9mB5SxIBGzyETSaYiGxeqOyHKpF+ehVcoyKUGkF4rtIQyW2WGi52fOz6MWN3li/iUEIluPJwUp+SiCRL3Vm+0bSjBJbfbjS5Nyya3XHJPIqtABqRmp2hEQYYyctxuSHQd/r9cLvrDSnMD/JNkMQpS1ag0kCxhP8gEguzi4HIxSZIzmxwgMz6+9QwtpWbPHmFbqwVC9TA2l3QfNGdYCyJnGh0S94sBxfQIeVytxzJ4NBKfGyt9lxbNFlo5QvsjwyVpRcbMgFTO53MtiT5PyP58PrI9zfQIP7mn+W/Pf24AUV3Ljl/lCzh9fxRjDNwsSTWI0WkisWLWaKxyFxxHDgjVJLUgaslMLkRyS5GakAl1tlnJgdl8r/XI8XhUdEzsa65V5xAonHJX12A8DpKEtmJeYymkyV5aDCyQshlKU88gqnZW4xqPM/RgUqmJsZ2v3xVVkMIOzEsQhNNxyy1s2sqs67lGlxhFK9eAJyWIflizrHunYi2dy5HEI/GYBcXyJSdzIrEul4o5Igsura5Fv2hKh6rxWJDZdkBQrgr4ADmeNMyB5ddeV/0MUak0NRwWP7UrD5j9fp+dMh7HAeH3VydRdcXkwqABxPaICJVl1H5fIImpMrwYHEketf2xQ8fINb8QX6tBgHe85sKoQbRV8WU60BofMb1M3joQUPdv/scFgfWAJ9gMuV+rhq3lSOoB23rS09aak2JNY+F0M0DWS/O5au8pT/7PRLjkNUq4CO/PPlqyB+LPk61wdOnSpUuXUcpfWPyMrzR+Fb9DWh7xHrIVj7yXfPZ3AKN8+rcZg3SQt5OtcHTp0uX/LP8FAAD//0axFmlW8f45AAAAAElFTkSuQmCC">
</body>
</html>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM