验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分 计算机 和人类的 图灵测试 )的缩写,是一种区分用户是计算机还是人的公共全自动 程序 。可以防止:恶意破解密码、 刷票 、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
package main
import (
"fmt"
"github.com/dchest/captcha"
"log"
"net/http"
)
func main() {
// 获取验证码 ID
http.HandleFunc("/captcha/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", err)
}
})
// 获取验证码图片
http.HandleFunc("/captcha/image", func(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
if id == "" {
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "image/png")
if err := captcha.WriteImage(w, id, 120, 80); err != nil {
log.Println("show captcha error", err)
}
})
// 业务处理
http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
log.Println("parseForm error", err)
http.Error(w, "Internal Error", http.StatusInternalServerError)
return
}
// 获取验证码 ID 和验证码值
id := r.FormValue("id")
value := r.FormValue("value")
// 比对提交的验证码值和内存中的验证码值
if captcha.VerifyString(id, value) {
fmt.Fprint(w, "ok")
} else {
fmt.Fprint(w, "mismatch")
}
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
到此这篇关于Golang Http 验证码示例实现的文章就介绍到这了,更多相关Golang Http 验证码 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!