Go项目实战之验证码的生成和使用(易扩展方式)【goshop开源项目 | 20220516更新】

qiaoshuai951123 · · 1446 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

### goshop开源项目的更新 >备注:前面项目中用到的代码已经分享到`GitHub`中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。 > 地址 [`goshop`](https://gitee.com/jobhandsome/goshop/) 感兴趣的可以点个`star`哦~  [`goshop开源项目的更新` ](https://gitee.com/jobhandsome/goshop/) #### 今天咱们做一个`登录功能中的验证码功能`: 1. **封装验证码生成,验证码验证等功能,以便多复用** 2. **封装session的中间件** #### 接下来咱们就来实现以上的问题和功能: * **先封装验证码业务部分** ```go // 生成验证码 func Captcha(ctx *gin.Context) { // 默认验证码生成长度6位 l := captcha.DefaultLen // 这里使用viper读取yaml的配置文件参数 // w 验证码宽度 h验证码高度 l 验证码生成位数 w, _ := strconv.Atoi(viper.GetString("captcha.w")) h, _ := strconv.Atoi(viper.GetString("captcha.h")) l, _ = strconv.Atoi(viper.GetString("captcha.length")) // 初始化 验证码长度 captchaId := captcha.NewLen(l) // 开启session session := sessions.Default(ctx) // 设置session,存储验证码数值 session.Set("captcha", captchaId) // 保存到session _ = session.Save() // 验证码生成 _ = Serve(ctx.Writer, ctx.Request, captchaId, ".png", viper.GetString("captcha.lang"), false, w, h) } // 验证码的header头设置,生成页面显示 func Serve(w http.ResponseWriter, r *http.Request, id, ext, lang string, download bool, width, height int) error { w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Pragma", "no-cache") w.Header().Set("Expires", "0") var content bytes.Buffer switch ext { case ".png": w.Header().Set("Content-Type", "image/png") _ = captcha.WriteImage(&content, id, width, height) case ".wav": w.Header().Set("Content-Type", "audio/x-wav") _ = captcha.WriteAudio(&content, id, lang) default: return captcha.ErrNotFound } // 是否下载验证码 if download { w.Header().Set("Content-Type", "application/octet-stream") } // 写入到页面中 http.ServeContent(w, r, id+ext, time.Time{}, bytes.NewReader(content.Bytes())) return nil } // 验证 func CaptchaVerify(c *gin.Context, code string) bool { session := sessions.Default(c) if captchaId := session.Get("captcha"); captchaId != nil { session.Delete("captcha") _ = session.Save() // 验证 生成的验证码数值 if captcha.VerifyString(captchaId.(string), code) { return true } else { return false } } else { return false } } ``` * **验证码生成业务代码封装好了,接下来就是如何访问显示生成的验证码图片** ```go // 首先要在对应的route文件中,配置一下路由,进行验证码的生成和显示 authGroup.GET("/captcha", func(ctx *gin.Context) { captcha.Captcha(ctx) }) ``` * **在对应的登录逻辑中,加入相应的逻辑:** ```go captcha := params["captchaCode"].(string) // 验证验证码 if !captcha2.CaptchaVerify(ctx, captcha) { utils.Fail(ctx, "验证码不正确", nil) return } ``` * **接下来:封装一下session中间件** ```go // 中间件,处理session func Session(keyPairs string) gin.HandlerFunc { store := SessionConfig() return sessions.Sessions(keyPairs, store) } func SessionConfig() sessions.Store { sessionMaxAge := 3600 sessionSecret := "topgoer" var store sessions.Store store = cookie.NewStore([]byte(sessionSecret)) store.Options(sessions.Options{ MaxAge: sessionMaxAge, //seconds Path: "/", }) return store } ``` * **最后开启一下session** ```go // 开启session r.Use(middleware.Session("topgoer")) ``` **说到这里,就全部实现了,验证码的生成,显示,验证,和使用等相关功能!** ### 更多功能请持续关注!!!!! ### 欢迎各位加我的微信(`jobhandsome`)跟我一起完成并推动项目的发展! ![加入我们.png](https://static.golangjob.cn/220428/76016202be4db073f7b6c7598e4f1f26.png)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1446 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传