// example of HTTP server that uses the captcha package.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/go-redis/redis"
"github.com/mojocn/base64Captcha"
)
// customizeRdsStore An object implementing Store interface
type customizeRdsStore struct {
redisClient *redis.Client
}
// customizeRdsStore implementing Set method of Store interface
func (s *customizeRdsStore) Set(id string, value string) {
err := s.redisClient.Set(id, value, time.Minute*10).Err()
if err != nil {
log.Println(err)
}
}
// customizeRdsStore implementing Get method of Store interface
func (s *customizeRdsStore) Get(id string, clear bool) (value string) {
val, err := s.redisClient.Get(id).Result()
if err != nil {
log.Println(err)
return ""
}
if clear {
err := s.redisClient.Del(id).Err()
if err != nil {
log.Println(err)
return ""
}
}
return val
}
func init() {
// create redis client
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// init redis store
customeStore := customizeRdsStore{client}
base64Captcha.SetCustomStore(&customeStore)
}
// ConfigJsonBody json request body.
type ConfigJsonBody struct {
Id string
CaptchaType string
VerifyValue string
ConfigAudio base64Captcha.ConfigAudio
ConfigCharacter base64Captcha.ConfigCharacter
ConfigDigit base64Captcha.ConfigDigit
}
// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
// parse request parameters
// 接收客户端发送来的请求参数
decoder := json.NewDecoder(r.Body)
var postParameters ConfigJsonBody
err := decoder.Decode(&postParameters)
if err != nil {
log.Println(err)
}
defer r.Body.Close()
// create base64 encoding captcha
// 创建base64图像验证码
var config interface{}
switch postParameters.CaptchaType {
case "audio":
config = postParameters.ConfigAudio
case "character":
config = postParameters.ConfigCharacter
default:
config = postParameters.ConfigDigit
}
captchaId, captcaInterfaceInstance := base64Captcha.GenerateCaptcha(postParameters.Id, config)
base64blob := base64Captcha.CaptchaWriteToBase64Encoding(captcaInterfaceInstance)
// or you can just write the captcha content to the httpResponseWriter.
// before you put the captchaId into the response COOKIE.
// captcaInterfaceInstance.WriteTo(w)
// set json response
// 设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": 1, "data": base64blob, "captchaId": captchaId, "msg": "success"}
json.NewEncoder(w).Encode(body)
}
// base64Captcha verify http handler
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {
// parse request parameters
// 接收客户端发送来的请求参数
decoder := json.NewDecoder(r.Body)
var postParameters ConfigJsonBody
err := decoder.Decode(&postParameters)
if err != nil {
log.Println(err)
}
defer r.Body.Close()
// verify the captcha
// 比较图像验证码
verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue)
// set json response
// 设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed"}
if verifyResult {
body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified"}
}
json.NewEncoder(w).Encode(body)
}
// start a net/http server
func main() {
staticPath := fmt.Sprintf("%s/src/github.com/mojocn/base64Captcha/_examples/static", os.Getenv("GOPATH"))
// serve Vuejs+ElementUI+Axios Web Application
http.Handle("/", http.FileServer(http.Dir(staticPath)))
// api for create captcha
http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)
// api for verify captcha
http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)
fmt.Println("Server is at localhost:7777")
if err := http.ListenAndServe("localhost:7777", nil); err != nil {
log.Fatal(err)
}
}