使用github的项目gocaptcha,我自己用起来感觉不错。

一、实现流程

(1)首先下载这个gocaptcha项目,需要自己编译

下载地址:

https://github.com/hanguofeng/gocaptcha/tree/master/samples/gocaptcha-server

说明:

https://github.com/hanguofeng/gocaptcha/wiki/QuickStartGocaptchaServer

(2)我的使用思路

获取验证码图片:

  1. 用户访问网页,希望通过/getimage获取验证码图片。
  2. go server收到请求,马上通过get请求访问http://localhost/getkey去取得一个key。
  3. 然后把这个key拼接string构造成一个访问地址”http://localhost/showimage?key=”+captchakey。
  4. 然后把请求地址重定向至这个showimage的页面,就返回了验证码图片。

验证用户输入的验证码:

  1. 用户输入验证码,提交验证码到/checkcaptchacode。
  2. go server收到验证码参数,拼接url成为”http://localhost/verify?key=” + captchakey + “&code=” + code。
  3. 然后访问url,获取返回值,就知道验证码的验证结果。
  4. 之后进行其他的操作即可。

(3)我的实现过程

1.获取验证码图片

get方法访问http://localhost/getkey地址,获得key的json返回值:

解析get方法返回的jsonreturn,获取key:

定义请求链接:

对应的转发方法:

之后就重定向至:

http.Redirect(rw, req, “http://localhost/showimage?key=”+captchakey, http.StatusFound)

就可以返回验证码图片了。

(4)代码中的问题

为了验证验证码,需要把captchakey保存起来,一般来说应该是保存成session形式,为了简单起见我这里是直接保存成一个string了。

但是保存成string是会出很多问题的,这是一个严重的业务逻辑错误。

如果要在其他函数中获取这个captchakey,只能把captchakey设为全局变量。如果设为全局变量,那就意味着captchakey可以被覆盖,当多人同时进行验证码提交操作,就会使captchakey多次被覆盖失效,无法实现方法。

我认为正确做法是:

保存成session,key为captchakey或者为当前的username什么的,因为key是唯一的,那么session就不能被覆盖了。

value则为captchakey,在验证的时候需要根据session的key去获得session的value,就能简单地进行验证了。

验证完毕后就进行session的销毁,而不是依赖go的GC,那么性能也能够有所保障。

(5)验证验证码

提交验证码至/checkcaptchacode路径,调用checkcaptchacode方法,故注册路由:

其余代码实现:

首先根据刚才获取的key和code拼接成url:”http://localhost/verify?key=” + captchakey + “&code=” + code。

get访问这个地址取得json,然后通过getcaptchaError_no方法来获取json中的错误码来进行验证码正确与否的判断。

之后就根据判断的结果来进行其他想进行的操作就可以了。

(6)实现效果:

1

二、总结

记录一下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注