.NET 6 實現滑動驗證碼(五)、驗證碼設置與緩存

来源:https://www.cnblogs.com/gmval/archive/2022/12/16/16988341.html
-Advertisement-
Play Games

一:背景 1.講故事 前幾天有位朋友找到我,說他的程式出現了偶發性崩潰,已經抓到了dump文件,Windows事件日誌顯示的崩潰點在 clr.dll 中,讓我幫忙看下是怎麼回事,那到底怎麼回事呢? 上 WinDbg 說話。 二:WinDbg 分析 1. 崩潰點在哪裡 如果是托管代碼引發的崩潰,線上程 ...


這一節,我們在Constant目錄中,定義兩個類CaptchaOptions.cs與CaptchaTypeConstant。目的是設置驗證碼的類型與其他一些屬性。然後在Storage目錄中,設置驗證碼的緩存數據。

上一節內容:.NET 6 實現滑動驗證碼(四)、擴展類


目錄

CaptchaOptions.cs

Constant 文件夾下新建立CaptchaOptions.cs。定義驗證碼過期時間、緩存key值、容錯值等。

using SlideCaptcha.Model;
using System.Collections.Generic;

namespace SlideCaptcha.Constant
{
    public class CaptchaOptions
    {
        /// <summary>
        /// 過期時長
        /// </summary>
        public int ExpirySeconds { get; set; } = 60;

        /// <summary>
        /// 存儲鍵首碼
        /// </summary>
        public string StoreageKeyPrefix { get; set; } = "slide-captcha";

        /// <summary>
        /// 容錯值(校驗時用,缺口位置與實際滑動位置匹配容錯範圍)
        /// </summary>
        public float Tolerant { get; set; } = 0.02f;

        /// <summary>
        /// 背景圖
        /// </summary>
        public List<Resource> Backgrounds { get; set; } = new List<Resource>();

        /// <summary>
        /// 模板圖(必須是slider,notch的順序依次出現)
        /// </summary>
        public List<TemplatePair> Templates { get; set; } = new List<TemplatePair>();
    }
}

CaptchaTypeConstant.cs

Constant 文件夾下新建立CaptchaTypeConstant.cs。定義各種常見驗證碼類型:

namespace SlideCaptcha.Constant
{
    public class CaptchaTypeConstant
    {
        /** 滑塊. */
        public static string SLIDER = "SLIDER";
        /** 旋轉. */
        public static string ROTATE = "ROTATE";
        /** 拼接.*/
        public static string CONCAT = "CONCAT";
        /** 圖片點選.*/
        public static string IMAGE_CLICK = "IMAGE_CLICK";
        /** 文字圖片點選.*/
        public static string WORD_IMAGE_CLICK = "WORD_IMAGE_CLICK";

    }
}

本次我們只實現滑塊驗證碼。旋轉、拼接、圖片點選,文字圖片點選暫不考慮。不過在源碼中,已添加了旋轉驗證碼的實現,目前還在測試中。

DefaultStorage.cs

Storage文件夾建立DefaultStorage.cs,定義緩存的各種方法。

using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using SlideCaptcha.Constant;
using SlideCaptcha.Interface;
using System;
using System.Text;

namespace SlideCaptcha.Storage
{
    public class DefaultStorage : IStorage
    {
        private readonly IDistributedCache _cache;
        private readonly IOptionsMonitor<CaptchaOptions> _options;

        public DefaultStorage(IOptionsMonitor<CaptchaOptions> options, IDistributedCache cache)
        {
            _options = options;
            _cache = cache;
        }

        private string WrapKey(string key)
        {
            return $"{this._options.CurrentValue.StoreageKeyPrefix}{key}";
        }

        public T Get<T>(string key)
        {
            var bytes = _cache.Get(WrapKey(key));
            if (bytes == null) return default(T);
            var json = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
            return JsonConvert.DeserializeObject<T>(json);
        }

        public void Remove(string key)
        {
            _cache.Remove(WrapKey(key));
        }

        public void Set<T>(string key, T value, DateTimeOffset absoluteExpiration)
        {
            string json = JsonConvert.SerializeObject(value);
            byte[] bytes = Encoding.UTF8.GetBytes(json);

            _cache.Set(WrapKey(key), bytes, new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = absoluteExpiration
            });
        }
    }
}

緩存使用的是IDistributedCache 介面,方便集成在項目的時候,選擇需要的緩存,如MemoryCache或Redis。

下一篇,開始寫驗證碼圖片與驗證碼凹槽的獲取。

下載方式:
掃描公眾號二維碼關註我,回覆captcha下載,壓縮包包含了驗證碼類庫、服務端API、HTML+JQuery完整代碼、vue3組件代碼及演示代碼!

歡迎大家關註我的微信公眾號,一起進步,一起成長
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:耿宗傑 前言 關於pprof的文章在網上已是汗牛充棟,卻是千篇一律的命令介紹,鮮有真正實操的,本文將參考Go社區資料,結合自己的經驗,實戰Go程式的性能分析與優化過程。 優化思路 首先說一下性能優化的一般思路。系統性能的分析優化,一定是從大到小的步驟來進行的,即從業務架構的優化,到系統架構的優 ...
  • 前言 網易雲的Vip音樂下載下來,格式不是mp3/flac這種通用的音樂格式,而是經過加密的ncm文件。只有用網易雲的音樂App才能夠打開。於是想到可不可以把.ncm文件轉換成mp3或者flac文件,上google查了一下,發現有不少人已經做了這件事,但沒有發現C語言版本的,就想著寫一個純C語言版本 ...
  • pandas 為什麼學習pandas numpy已經可以幫助我們進行數據的處理了,那麼學習pandas的目的是什麼呢? numpy能夠幫助我們處理的是數值型的數據,當然在數據分析中除了數值型的數據還有好多其他類型的數據(字元串,時間序列),那麼pandas就可以幫我們很好的處理除了數值型的其他數據! ...
  • 大家好,咱們前面通過十篇的文章介紹了docker的基礎篇,從本篇開始,咱們的《docker學習系列》將要進入到高級篇階段(基礎篇大家可以查看之前發佈的文章)。 咱們先來介紹:docker複雜方式安裝軟體。通過按照mysql\redis兩個案例來講解 Docker複雜安裝說明,兩個案例: 1:安裝my ...
  • 1 線程安全定義 含糊的定義:如果一個對象可以安全地被多個線程同時使用,那它就是線程安全的 嚴謹的定義: 當多個線程同時訪問一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲得正確的結果,那就稱這個對 ...
  • 大家好,我是棧長,Nacos 2.2.0 正式發佈了! Nacos 2.2.0 還真是一個比較重要的版本,因為它涉及了太多重大更新,今天棧長給大家來解讀下。 Nacos 2.2.0 重大更新 1、刪除冗餘代碼 Nacos 2.2.0 刪除了 Nacos 1.x 版本中 Naming 和雙寫相關的舊冗 ...
  • 在作者之前的 十二條後端開發經驗分享,純乾貨 文章中介紹的 優雅得Springboot + mybatis配置多數據源方式 里有很多小伙伴在評論區留言詢問多個數據源同時在一個方法中使用時,事務是否會正常有效,這裡作者 理論 + 實踐 給大家解答一波,老規矩,附作者github地址: https:// ...
  • 一、線程簡介 1. 什麼是進程? 電腦中會有很多單獨運行的程式,每個程式有一個獨立的進程,而進程之間是相互獨立存在的。例如圖中的微信、酷狗音樂、電腦管家等等。 2. 什麼是線程? 進程想要執行任務就需要依賴線程。換句話說,就是進程中的最小執行單位就是線程,並且一個進程中至少有一個線程。 那什麼又是多 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...