如何实现Golang的Http验证码

  

本文将为大家详细介绍“如何实现Golang的Http验证码”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“如何实现Golang的Http验证码”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧。

golang的优点有哪些

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

Golang Http 验证码示例

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

传统网站验证码工作机制

  • 客户端请求服务器获取验证码图片

  • 服务器生成随机串(验证码值)写入Session,并将验证码值写入到图片中返回给客户端

  • 客户端输入图片上的字符串提交给服务器验证

  • 服务器比对客户端提交的字符串值和 Session 中是否匹配,如果匹配则通过验证

由于服务器生成的验证码值从始至终均未返回给客户端,因此,客户端只能从图片中识别验证码字符串,从而保证人机校验逻辑。

Go的HTTP验证码

思路

Go 语言的 HTTP 服务器默认不支持 Session,因此验证码值需要换个思路存储,以下是不使用 Session 的逻辑

  • 客户端请求服务器获取验证码ID

  • 服务器生成验证码 ID,并生成验证码值,将 ID 和值的映射关系记录到内存或缓存,并将 ID 返回给客户端

  • 客户端根据返回的 ID 请求服务器获取验证码图片

  • 服务器获取到验证码 ID,从内存或缓存中取出验证码值,将该值写入图片并将图片返回给客户端

  • 客户端提交验证码 ID(第1步获得)和验证码值给服务器验证

  • 服务器获取验证码 ID,从内存或缓存中取出验证码值与客户端提交的验证码值比对

示例

  1. 安装验证码依赖

github.com/dchest/captcha
  1. 代码实现

package main
  ,,
  ,,import  (
  ,,,,,,“fmt"
  ,,,,,,“;github.com/dchest/captcha"
  ,,,,,,“log"
  ,,,,,,“;net/http"
  ,,,)
  ,,
  ,,func  main (), {
  ,,,,,,//,获取验证码,ID
  ,,,,,,http.HandleFunc(“/验证码/generate",, func (w  http.ResponseWriter, r  * http.Request), {
  ,,,,,,,,,,id :=, captcha.NewLen (6)
  ,,,,,,,,,,if  _, err :=, fmt.Fprint (w, id);, err  !=, nil  {
  ,,,,,,,,,,,,,,log.Println (“generate  captcha  error",,呃)
  ,,,,,,,,,,}
  ,,,,,,})
  ,,,,,,//,获取验证码图片
  ,,,,,,http.HandleFunc(“/验证码/image",, func (w  http.ResponseWriter, r  * http.Request), {
  ,,,,,,,,,,id :=, r.URL.Query () . get (“id")
  ,,,,,,,,,,if  id ==,,,, {
  ,,,,,,,,,,,,,,http.Error (w,“Bad  Request",, http.StatusBadRequest)
  ,,,,,,,,,,,,,,回来
  ,,,,,,,,,,}
  ,,,,,,,,,,w.Header()这里(“Content-Type",,“图像/png")
  ,,,,,,,,,,if  err :=, captcha.WriteImage (w, id,, 120,, 80);, err  !=, nil  {
  ,,,,,,,,,,,,,,log.Println (“show  captcha  error",,呃)
  ,,,,,,,,,,}
  ,,,,,,})
  ,,,,,,//,业务处理
  ,,,,,,http.HandleFunc (“/login",, func (w  http.ResponseWriter, r  * http.Request), {
  ,,,,,,,,,,if  err :=, r.ParseForm ();, err  !=, nil  {
  ,,,,,,,,,,,,,,log.Println (“parseForm  error",,呃)
  ,,,,,,,,,,,,,,http.Error (w,“Internal  Error",, http.StatusInternalServerError)
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

如何实现Golang的Http验证码