生成验证码和检查验证码

package main

import (
   "github.com/mojocn/base64Captcha"
   "image/color"
   "net/http"
   "time"
)

// Captcha对象(单例模式)
var captcha *base64Captcha.Captcha = nil

// GetCaptcha
// @description 获取Captcha对象(单例模式)
// @return *base64Captcha.Captcha Captcha对象(单例模式)
func GetCaptcha() *base64Captcha.Captcha {
   // Captcha对象为单例模式,优先从内存中获取
   if captcha != nil {
      return captcha
   }

   // 配置验证码参数
   driverString := base64Captcha.DriverString{
      Width:           100,                                         // 图片宽度
      Height:          40,                                          // 图片高度
      Length:          4,                                           // 验证码字符数
      Source:          "0123456789",                                // 验证码字符源
      BgColor:         &color.RGBA{R: 204, G: 232, B: 207, A: 255}, // 图片背景色
      ShowLineOptions: base64Captcha.OptionShowSineLine,            // 干扰线
      NoiseCount:      0,                                           // 干扰字符数
      Fonts:           []string{"wqy-microhei.ttc"},                // 字体文件
   }

   // 驱动器
   driver := driverString.ConvertFonts()

   // 创建验证码存储器(存储在内存中,最多储存10240个验证码,过期时间为10分钟)
   store := base64Captcha.NewMemoryStore(10240, time.Minute*10)

   // 创建Captcha对象,并将其保存到全局变量(内存),实现单例模式
   captcha = base64Captcha.NewCaptcha(driver, store)

   return captcha
}

// CaptchaGenerate
// @description 生成验证码
// @return id string 验证码ID
// @return b64s string 验证码图片(base64编码字符串)
// @return err error 错误对象
func CaptchaGenerate() (id string, b64s string, err error) {
   // 生成验证码ID和验证码图片(base64编码字符串)
   id, b64s, err = GetCaptcha().Generate()
   return
}

func main() {
   // 显示验证码页面地址:http://localhost:8080/captcha.html
   http.HandleFunc("/captcha.html", func(writer http.ResponseWriter, request *http.Request) {
      writer.Header().Set("Content-Type", "text/html; charset=utf-8")

      // 生成验证码ID和验证码图片(base64编码字符串)
      id, b64s, err := CaptchaGenerate()
      if err != nil {
         _, _ = writer.Write([]byte("生成验证码图片失败:" + err.Error()))
         return
      }

      // 在页面显示验证码ID和验证码图片(base64编码字符串)
      _, _ = writer.Write([]byte("ID:" + id + "<br><br>"))
      _, _ = writer.Write([]byte("<img src=" + b64s + ">"))
      // 重要说明:这里可以改为以JSON格式输出验证码ID和验证码图片,前端通过AJAX获
      //           取JSON并显示图片,验证时前端把验证码ID和验证码字符传递给后端。
   })

   // 检查验证码页面地址:http://localhost:8080/verify.html?id={验证码ID}&answer={验证码字符}
   http.HandleFunc("/verify.html", func(writer http.ResponseWriter, request *http.Request) {
      id := request.URL.Query().Get("id")         // 验证码ID
      answer := request.URL.Query().Get("answer") // 验证码字符

      // 检查验证码是否正确,第三个参数表示检查完后(不管正确还是错误)是否将该验证码从存储器中删除
      verify := GetCaptcha().Store.Verify(id, answer, true)
      if verify {
         _, _ = writer.Write([]byte("✔️ 验证码正确 ✔️"))
      } else {
         _, _ = writer.Write([]byte(" 验证码错误 "))
      }
   })

   // 启动HTTP服务器
   err := http.ListenAndServe(":8080", nil)
   if err != nil {
      panic("启动HTTP服务器失败:" + err.Error())
   }
}

// ========== 总结 ========== //
// 1、先打开显示验证码页面获取验证码ID和验证码图片,再打开检查验证码页面(URL携带验证码ID和验证码字符参数)。

Copyright © 2024 码农人生. All Rights Reserved