Der Client fordert den Server auf, das Bild des Bestätigungscodes zu erhalten.
Der Server generiert eine zufällige Zeichenfolge (Bestätigungscodewert) und schreibt sie in die Sitzung und schreibt den Bestätigungscodewert in das Bild ein und gibt es an den Client zurück. Die vom Client eingegebene Zeichenfolge für das Bild wird zur Überprüfung an den Server übermittelt. Der Server vergleicht den vom Client übermittelten Zeichenfolgenwert und die Sitzung. Wenn er übereinstimmt, übergibt er den Verifizierung
- Da der vom Server generierte Verifizierungscodewert von Anfang bis Ende ist, wird der Verifizierungscode nicht an den Client zurückgegeben. Daher kann der Client die Verifizierungscodezeichenfolge nur anhand des Bildes identifizieren, wodurch der Mensch sichergestellt wird -Maschinenverifizierungslogik.
- Der HTTP-Bestätigungscode von Go
- Gedanken
Der Client fordert den Server auf, die Bestätigungscode-ID zu erhalten
Der Server generiert die Bestätigungscode-ID und den Bestätigungscodewert, zeichnet die Zuordnungsbeziehung zwischen der ID und dem Wert im Speicher oder Cache auf und gibt die ID an den Client zurück Der Client fordert den Server auf, das Bestätigungscode-Bild basierend auf der zurückgegebenen ID zu erhalten.
Der Server erhält die Bestätigungscode-ID, ruft den Bestätigungscodewert aus dem Speicher oder Cache ab, schreibt den Wert in das Bild und gibt das Bild an den Client zurück
Der Client übermittelt die Bestätigungscode-ID (erhalten in Schritt 1) und den Bestätigungscodewert an die Serververifizierung.
- Der Server erhält die Bestätigungscode-ID, ruft den Bestätigungscodewert aus dem Speicher oder Cache ab und vergleicht ihn mit dem Bestätigungscode Vom Kunden übermittelter Wert
- Beispiel
- Installation der Bestätigungscode-Abhängigkeit
github.com/dchest/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)) }Ausführen
- Besuchen Sie /captcha/generate, um die Bestätigungscode-ID zu erhalten
- Besuchen Sie /captcha /image?id=Verifizierungscode-ID
- Besuchen Sie /login und geben Sie im ersten Schritt die Bestätigungscode-ID und im zweiten Schritt den Verifizierungscodewert ein, um die Verifizierungsergebnisse anzuzeigen
-
Projektadresse
- https:/ /github.com/xileistudio/go-http-captcha-example