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