中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go怎么整合captcha實現驗證碼功能

發布時間:2023-03-01 14:01:00 來源:億速云 閱讀:104 作者:iii 欄目:開發技術

這篇“Go怎么整合captcha實現驗證碼功能”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go怎么整合captcha實現驗證碼功能”文章吧。

1 captcha概述

captcha的使用設計流程

Go怎么整合captcha實現驗證碼功能

2 實現代碼(使用內存緩存)

2.1 后端代碼

生成驗證碼圖片API:

//GenerateImg 生成驗證碼圖片名稱
func GenerateImg(w http.ResponseWriter, req *http.Request) {
   w.Header().Set("Access-Control-Allow-Origin", "*")             //允許訪問所有域
   w.Header().Add("Access-Control-Allow-Headers", "Content-Type") 
   d := struct {
      CaptchaId string
   }{
      captcha.New(),
   }
   bytes, _ := json.Marshal(map[string]interface{}{"code": 0, "msg": "", "count": 0, "data": d.CaptchaId})
   w.Write(bytes)
}

HTTP服務:

func RunHttp(port string) {
   logger := log.Default()

   http.Header{}.Set("Access-Control-Allow-Origin", "*")

   http.HandleFunc("/user/login", controller.UserLogin) //登錄API
   http.HandleFunc("/img", controller.GenerateImg)  //生成驗證碼圖片API
   http.Handle("/verify/", captcha.Server(captcha.StdWidth, captcha.StdHeight)) //刷新驗證碼API

   logger.Println("Http Server Running port:", port, "...")
   http.ListenAndServe(":"+port, nil)
}

啟動HTTP服務:

func main() {
   web.RunHttp("8000")
}

驗證碼驗證:

//UserLogin 用戶登錄
func UserLogin(w http.ResponseWriter, req *http.Request) {
   w.Header().Set("Access-Control-Allow-Origin", "*")
   w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
   ......
   var m map[string]string
   body, err := ioutil.ReadAll(req.Body)
   if err != nil {
      panic(err)
   }
   json.Unmarshal(body, &m)
   var k = m["verify_key"]
   var v = m["verify_value"]
   res := captcha.VerifyString(k, v)
   if res { // 驗證通過
     ......
   } else { // 驗證未通過
     ......
   }
   ......
}

2.2 前端代碼

......

<form class="layui-form" id="form">
    <h4 >登錄</h4>
    <div class="layui-form-item">
        <label class="layui-form-label">賬號</label>
        <div class="layui-input-inline">
            <input type="text" id="loginName" placeholder="請輸入賬號" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">密碼</label>
        <div class="layui-input-inline">
            <input type="password" id="loginPwd" placeholder="請輸入密碼" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">驗證碼</label>
        <div class="layui-input-inline">
            <input type="text" id="loginV" placeholder="請輸入驗證碼" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" type="button" onclick="login()">立即提交</button>
            <button type="button" onclick="toRegister()" class="layui-btn layui-btn-primary">注冊</button>
        </div>
    </div>
</form>
<img id="verify" onclick="reload()"></img>
......
<input type="hidden" id="verify_key">
</body>
<script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>
<script src="//cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
    const base_url = 'http://localhost:8000'

    init()

    function init() {
        $.ajax({
            url: base_url + "/img",
            type: "GET",
            success: function (res) {
                var obj = JSON.parse(res)
                $("#verify").attr("src", base_url + "/verify/" + obj.data + ".png")
                $("#verify_key").attr("value", obj.data)
            }
        })
    }

    function reload() {
        var url = $("#verify").attr("src");
        $("#verify").attr("src", url + "?reload=" + (new Date()).getTime())
    }

    function login() {
        var loginName = $("#loginName").val()
        var loginPwd = $("#loginPwd").val()
        var verify_key = $("#verify_key").val()
        var loginV = $("#loginV").val()
        var data = {
            'login_name': loginName,
            'pwd': loginPwd,
            'verify_key': verify_key,
            'verify_value': loginV
        }
        $.ajax({
            url: base_url + "/user/login",
            type: "POST",
            data: JSON.stringify(data),
            success: function (res) {
               ......
            },
            ......
        })
    }

   ......
   
</script>

2.3 注意點

跨域問題:可加入如下代碼

w.Header().Set("Access-Control-Allow-Origin", "*")             //允許訪問所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-Type")

3 自定義Store(使用Redis緩存)

3.1 自定義對象并實現Store抽象

Redis初始化:

var (
   RDB          *redis.Client
   TokenTimeOut = time.Second * 3600
)

func init() {
   RDB = redis.NewClient(&redis.Options{
      Addr:     "127.0.0.1:6379",
      Password: "",
      DB:       0,
   })
}

自定義結構體&實現Store抽象:

type StoreImpl struct {
   RDB        *redis.Client
   Expiration time.Duration
}

func (impl *StoreImpl) Set(id string, digits []byte) {
   impl.RDB.Set(context.Background(), id, string(digits), impl.Expiration)
}

func (impl *StoreImpl) Get(id string, clear bool) (digits []byte) {
   bytes, _ := impl.RDB.Get(context.Background(), id).Bytes()
   return bytes
}

3.2 配置captcha,加入自定義Store實現

//GenerateImg 生成驗證碼圖片名稱
func GenerateImg(w http.ResponseWriter, req *http.Request) {
   w.Header().Set("Access-Control-Allow-Origin", "*")             //允許訪問所有域
   w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的類型
   //需要在New之前進行指定
   captcha.SetCustomStore(&verify.StoreImpl{
      RDB:        dao.RDB,
      Expiration: time.Second * 1000,
   })
   d := struct {
      CaptchaId string
   }{
      captcha.New(),
   }
   bytes, _ := json.Marshal(map[string]interface{}{"code": 0, "msg": "", "count": 0, "data": d.CaptchaId})
   w.Write(bytes)
}

3.3 注意點

  • 需要在captcha.New()之前進行captcha.SetCustomStore()

  • 在captcha.SetCustomStore()之后,自定義的方法實現Store接口時需要完整實現,也就是能真正的實現存儲或緩存功能,否則驗證碼無法生成

以上就是關于“Go怎么整合captcha實現驗證碼功能”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

繁峙县| 天峨县| 崇义县| 内丘县| 博兴县| 庆安县| 靖宇县| 乐东| 民权县| 杭锦后旗| 宾阳县| 睢宁县| 益阳市| 江阴市| 成武县| 丰台区| 双辽市| 隆安县| 榕江县| 山西省| 浙江省| 通化市| 彰武县| 德州市| 宝清县| 平遥县| 叶城县| 延安市| 普宁市| 黑河市| 克什克腾旗| 和硕县| 普格县| 仪征市| 蒙自县| 永兴县| 石渠县| 贡嘎县| 满城县| 北流市| 左贡县|