分享一个Golang Http 验证码示例


当前第2页 返回上一页

Go的HTTP验证码

思路

Go 语言的 HTTP 服务器默认不支持 Session,因此验证码值需要换个思路存储,以下是不使用 Session 的逻辑

  • 客户端请求服务器获取验证码ID
  • 服务器生成验证码 ID,并生成验证码值,将 ID 和值的映射关系记录到内存或缓存,并将 ID 返回给客户端
  • 客户端根据返回的 ID 请求服务器获取验证码图片
  • 服务器获取到验证码 ID,从内存或缓存中取出验证码值,将该值写入图片并将图片返回给客户端
  • 客户端提交验证码 ID(第1步获得)和验证码值给服务器验证
  • 服务器获取验证码 ID,从内存或缓存中取出验证码值与客户端提交的验证码值比对

示例

  1. 安装验证码依赖

1

github.com/dchest/captcha

  1. 代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

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))

   }

  1. 运行

    1. 访问/captcha/generate获得验证码 ID
    2. 访问/captcha/image?id=验证码 ID
    3. 访问/login,并输入第一步的验证码 ID 和第二步的验证码值即可查看验证结果

项目地址

https://github.com/xialeistudio/go-http-captcha-example

以上就是分享一个Golang Http 验证码示例的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

交叉编译arm版tcping

golang 控制重定向

golang语言社区--游戏服务器编程说明

golang互斥锁 sync.mutex

leetcode354 俄罗斯套娃信封问题 golang

手撸golang 基本数据结构与算法 选择排序

golang错误抛出的方法

必须掌握的golang23种设计模式之工厂方法模式

使用 pprof 进行 golang 程序内存分析

golang defer什么时候执行

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...