功能和验证码使用原理
- 本案例中没有使用redis作为缓存,而是使用的内存存储方法
github链接地址
- 下载命令
go get github.com/mojocn/base64Captcha
请求处理函数
// 生成图片验证码
func (m *MemberController) captcha(context *gin.Context) {
// 生成图片验证码,并返回给客户端
tool.GenerateCaptcha(context)
}
// 校验图片验证码
func (m *MemberController) verifyCaptcha(context *gin.Context) {
var captchaResult tool.CaptchaResult
err := tool.Decode(context.Request.Body, &captchaResult) // 等价于:context.ShouldBind(&captchaResult)
if err != nil {
tool.Failed(context, "参数解析失败")
}
// 获取图片验证码的id和b64s,并校验
result := tool.VerifyCaptcha(captchaResult.Id, captchaResult.VerifyValue)
if result {
fmt.Println("图片验证码校验成功")
tool.Success(context, "校验成功")
} else {
fmt.Println("图片验证码校验失败")
tool.Failed(context, "校验失败")
}
}
package tool
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
)
type CaptchaResult struct {
Id string `json:"id"`
Base64Blog string `json:"base_64_blog"`
VerifyValue string `json:"code"`
}
// 默认存储10240个验证码,每个验证码10分钟过期
var store = base64Captcha.DefaultMemStore
// 生成图片验证码
func GenerateCaptcha(context *gin.Context) {
// 生成默认数字
driver := base64Captcha.DefaultDriverDigit
// 生成base64图片
captcha := base64Captcha.NewCaptcha(driver, store)
// 获取
id, b64s, err := captcha.Generate()
if err != nil {
fmt.Println("Register GetCaptchaPhoto get base64Captcha has err:", err)
}
captchaResult := CaptchaResult{Id: id, Base64Blog: b64s}
Success(context, map[string]interface{}{
"resultCaptcha": &captchaResult,
})
}
// 校验图片验证码,并清除内存空间
func VerifyCaptcha(id string, value string) bool {
// TODO 只要id存在,就会校验并清除,无论校验的值是否成功, 所以同一id只能校验一次
verifyResult := store.Verify(id, value, true)
return verifyResult
}
github链接