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