package controller import ( "bytes" "github.com/dchest/captcha" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "net/http" "time" ) func GetCaptchaV2(c *gin.Context) { from := c.Query("from") l := 4 w, h := 300, 50 captchaId := captcha.NewLen(l) session := sessions.DefaultMany(c, "go-session-b") session.Set("captcha_"+from, captchaId) _ = session.Save() _ = Serve(c.Writer, c.Request, captchaId, ".png", "zh", false, w, h) } func GetCaptcha(c *gin.Context) { l := 4 w, h := 107, 36 captchaId := captcha.NewLen(l) session := sessions.DefaultMany(c, "go-session-a") session.Set("captcha", captchaId) _ = session.Save() _ = Serve(c.Writer, c.Request, captchaId, ".png", "zh", false, w, h) } func Serve(w http.ResponseWriter, r *http.Request, id, ext, lang string, download bool, width, height int) error { w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Pragma", "no-cache") w.Header().Set("Expires", "0") var content bytes.Buffer switch ext { case ".png": w.Header().Set("Content-Type", "image/png") _ = captcha.WriteImage(&content, id, width, height) case ".wav": w.Header().Set("Content-Type", "audio/x-wav") _ = captcha.WriteAudio(&content, id, lang) default: return captcha.ErrNotFound } if download { w.Header().Set("Content-Type", "application/octet-stream") } http.ServeContent(w, r, id+ext, time.Time{}, bytes.NewReader(content.Bytes())) return nil }