Golang Http 验证码示例实现
验证码(CAPTCHA)是“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
传统网站验证码工作机制
- 客户端请求服务器获取验证码图片
- 服务器生成随机串(验证码值)写入Session,并将验证码值写入到图片中返回给客户端
- 客户端输入图片上的字符串提交给服务器验证
- 服务器比对客户端提交的字符串值和Session中是否匹配,如果匹配则通过验证
由于服务器生成的验证码值从始至终均未返回给客户端,因此,客户端只能从图片中识别验证码字符串,从而保证人机校验逻辑。
Go的HTTP验证码
思路
Go语言的HTTP服务器默认不支持Session,因此验证码值需要换个思路存储,以下是不使用Session的逻辑
- 客户端请求服务器获取验证码ID
- 服务器生成验证码ID,并生成验证码值,将ID和值的映射关系记录到内存或缓存,并将ID返回给客户端
- 客户端根据返回的ID请求服务器获取验证码图片
- 服务器获取到验证码ID,从内存或缓存中取出验证码值,将该值写入图片并将图片返回给客户端
- 客户端提交验证码ID(第1步获得)和验证码值给服务器验证
- 服务器获取验证码ID,从内存或缓存中取出验证码值与客户端提交的验证码值比对
示例
安装验证码依赖
github.com/dchest/captcha
代码实现
packagemain import( "fmt" "github.com/dchest/captcha" "log" "net/http" ) funcmain(){ //获取验证码ID http.HandleFunc("/captcha/generate",func(whttp.ResponseWriter,r*http.Request){ id:=captcha.NewLen(6) if_,err:=fmt.Fprint(w,id);err!=nil{ log.Println("generatecaptchaerror",err) } }) //获取验证码图片 http.HandleFunc("/captcha/image",func(whttp.ResponseWriter,r*http.Request){ id:=r.URL.Query().Get("id") ifid==""{ http.Error(w,"BadRequest",http.StatusBadRequest) return } w.Header().Set("Content-Type","image/png") iferr:=captcha.WriteImage(w,id,120,80);err!=nil{ log.Println("showcaptchaerror",err) } }) //业务处理 http.HandleFunc("/login",func(whttp.ResponseWriter,r*http.Request){ iferr:=r.ParseForm();err!=nil{ log.Println("parseFormerror",err) http.Error(w,"InternalError",http.StatusInternalServerError) return } //获取验证码ID和验证码值 id:=r.FormValue("id") value:=r.FormValue("value") //比对提交的验证码值和内存中的验证码值 ifcaptcha.VerifyString(id,value){ fmt.Fprint(w,"ok") }else{ fmt.Fprint(w,"mismatch") } }) log.Fatal(http.ListenAndServe(":8080",nil)) }
运行
- 访问/captcha/generate获得验证码ID
- 访问/captcha/image?id=验证码ID
- 访问/login,并输入第一步的验证码ID和第二步的验证码值即可查看验证结果
项目地址
https://github.com/xialeistudio/go-http-captcha-example
到此这篇关于GolangHttp验证码示例实现的文章就介绍到这了,更多相关GolangHttp验证码内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。