您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關用Blazor Server Side如何實現圖片驗證碼,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
關于Blazor
由于在國內, Blazor一點都不普及, 在閱讀此文前, 建議讀者先翻看我之前寫的隨筆, 了解Blazor Server Side的特點.
在一段時間內, 我會寫一些解說分析型的 "為什么選擇 Blazor Server Side" , 在適當的時候再寫快速入門系列.(無論是針對編程新學者還是多年經驗人士)
驗證碼
我們很多場合都實現過圖片驗證碼.
圖片驗證碼的主要關鍵是呈現圖片, 需要一個URL, 而這個URL需要傳遞參數以確定顯示什么東西.
這個驗證碼如何在服務器保存, 如何傳遞一個參數公開給客戶端, 還不能讓別人解密這個參數破解驗證碼, 都是麻煩事
這個例子是講述如何用極短的 "單頁" 代碼, 實現驗證過程.
先上圖:
再上代碼:
@page "/BlazorVerificationCode" <p> (Blazor) A sample for how to show verification code and verify it. </p> @inject IJSRuntime jsr @{ if (imgurl == null) MakeNewImage(); } <img src="@imgurl" /> <button @onclick="MakeNewImage">Renew</button> <hr /> <div>Type the number in image</div> <EditForm Model="this" OnSubmit="DoCheck"> <input type="text" @bind-value="inp_code" /> <button>Check</button> </EditForm> @code{ string inp_code; string vericode; string imgurl; void DoCheck() { string msg = "You typed a wrong value"; if (inp_code == vericode) msg = "Yes the number is " + vericode; jsr.InvokeAsync<object>("alert", msg); } void MakeNewImage() { vericode = new Random().Next(100000, 999999).ToString(); using SkiaSharp.SKBitmap bmp = new SkiaSharp.SKBitmap(200, 80); using (SkiaSharp.SKCanvas canvas = new SkiaSharp.SKCanvas(bmp)) { canvas.Clear(SkiaSharp.SKColors.White); using SkiaSharp.SKPaint skp = new SkiaSharp.SKPaint(); skp.Color = SkiaSharp.SKColors.Red; skp.TextSize = 40; canvas.DrawText(vericode, 30, 55, skp); canvas.Save(); } using System.IO.MemoryStream ms = new System.IO.MemoryStream(); using SkiaSharp.SKManagedWStream ws = new SkiaSharp.SKManagedWStream(ms); bmp.Encode(ws, SkiaSharp.SKEncodedImageFormat.Jpeg, 100); imgurl = "data:image/jpeg;base64," + Convert.ToBase64String(ms.ToArray()); } }
展現效果如下:
下面是解說
整個代碼只有 60 行.
已經包含了,展示界面, 生成圖片,傳遞和測試驗證碼的各部分.
代碼先用隨機數確保生成 vericode = new Random().Next(100000, 999999).ToString();
然后根據vericode生成一個圖片, 轉換成base64格式到 imgurl 變量
最后通過 <img src="@imgurl" />
呈現出來.
我上一篇隨筆有介紹, Blazor是'活'的, 是在服務器上生存著的.
<button @onclick="MakeNewImage">Renew</button>
在服務器上有活動的instance, 而在客戶端瀏覽器也有'鏡像副本'
當瀏覽器的'鏡像副本'被用戶點擊后, Blazor就會把事件回傳給服務器, 觸發服務器還在運行中的 MakeNewImage
MakeNewImage 會重新生成新的 vericode 與 imgurl , 并且按照Blazor默認行為, 會自動重新Render當前控件的內容, 所以 <img> 的 src 會被重新設置到新的imgurl , 展現新的圖片給用戶.
當用戶在 <input type="text" @bind-value="inp_code" />
輸入驗證碼后, Blazor會根據onchange事件, 把value發送到服務器, 根據 @bind-value="inp_code" 這個配置, 把值保存到 inp_code 上.
當 <button>Check</button>
被按下后, OnSubmit="DoCheck"
會觸發, 那么 DoCheck() 的代碼, 便可以判斷 inp_code == vericode
是否相同.
這個過程中, 和其他框架做法的最大不同是, Blazor 保持了服務器代碼運行的上下文, 因為上下文被保持了, 所以就不需要額外的傳遞了.
這就是為什么要 選擇 Blazor Server Side : 使用上下文來節省時間
最后:
如果把例子換成 發送短信/郵件驗證碼 , 原理是一樣的. 都無需利用其他代碼或資源去儲存傳遞驗證碼.
如果因任何原因, 頁面被刷新了, 那么這個內存中的上下文就會釋放, 丟失, 驗證碼也失效, 需要重發重試.
如果是通常注冊后的郵件激活URL , 這個就不合適了. 需要找外部儲存激活URL相關的數據.
關于用Blazor Server Side如何實現圖片驗證碼就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。