You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.6 KiB
100 lines
2.6 KiB
// example of HTTP server that uses the captcha package. |
|
package main |
|
|
|
import ( |
|
"encoding/json" |
|
"fmt" |
|
"git.diulo.com/mogfee/protoc-gen-kit/pkg/base64Captcha" |
|
"log" |
|
"net/http" |
|
) |
|
|
|
// configJsonBody json request body. |
|
type configJsonBody struct { |
|
Id string |
|
CaptchaType string |
|
VerifyValue string |
|
DriverAudio *base64Captcha.DriverAudio |
|
DriverString *base64Captcha.DriverString |
|
DriverChinese *base64Captcha.DriverChinese |
|
DriverMath *base64Captcha.DriverMath |
|
DriverDigit *base64Captcha.DriverDigit |
|
} |
|
|
|
var store = base64Captcha.DefaultMemStore |
|
|
|
// base64Captcha create http handler |
|
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) { |
|
//parse request parameters |
|
decoder := json.NewDecoder(r.Body) |
|
var param configJsonBody |
|
err := decoder.Decode(¶m) |
|
if err != nil { |
|
log.Println(err) |
|
} |
|
defer r.Body.Close() |
|
var driver base64Captcha.Driver |
|
|
|
//choose driver |
|
switch param.CaptchaType { |
|
case "audio": |
|
driver = param.DriverAudio |
|
case "string": |
|
driver = param.DriverString.ConvertFonts() |
|
case "math": |
|
driver = param.DriverMath.ConvertFonts() |
|
case "chinese": |
|
driver = param.DriverChinese.ConvertFonts() |
|
default: |
|
driver = param.DriverDigit |
|
} |
|
c := base64Captcha.NewCaptcha(driver, store) |
|
id, b64s, err := c.Generate() |
|
fmt.Println(id, b64s, err) |
|
body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"} |
|
if err != nil { |
|
body = map[string]interface{}{"code": 0, "msg": err.Error()} |
|
} |
|
w.Header().Set("Content-Type", "application/json; charset=utf-8") |
|
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 param configJsonBody |
|
err := decoder.Decode(¶m) |
|
if err != nil { |
|
log.Println(err) |
|
} |
|
defer r.Body.Close() |
|
//verify the captcha |
|
body := map[string]interface{}{"code": 0, "msg": "failed"} |
|
if store.Verify(param.Id, param.VerifyValue, true) { |
|
body = map[string]interface{}{"code": 1, "msg": "ok"} |
|
} |
|
|
|
//set json response |
|
w.Header().Set("Content-Type", "application/json; charset=utf-8") |
|
|
|
json.NewEncoder(w).Encode(body) |
|
} |
|
|
|
// start a net/http server |
|
func main() { |
|
//serve Vuejs+ElementUI+Axios Web Application |
|
http.Handle("/", http.FileServer(http.Dir("./static"))) |
|
|
|
//api for create captcha |
|
http.HandleFunc("/api/getCaptcha", generateCaptchaHandler) |
|
|
|
//api for verify captcha |
|
http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle) |
|
|
|
fmt.Println("Server is at :8777") |
|
if err := http.ListenAndServe(":8777", nil); err != nil { |
|
log.Fatal(err) |
|
} |
|
}
|
|
|