[Asp.Net Core]用Blazor Server Side實現(xiàn)圖片驗證碼
關(guān)于Blazor
由于在國內(nèi), Blazor一點都不普及, 在閱讀此文前, 建議讀者先翻看我之前寫的隨筆, 了解Blazor Server Side的特點.
在一段時間內(nèi), 我會寫一些解說分析型的 "為什么選擇 Blazor Server Side" , 在適當(dāng)?shù)臅r候再寫快速入門系列.(無論是針對編程新學(xué)者還是多年經(jīng)驗人士)
驗證碼
我們很多場合都實現(xiàn)過圖片驗證碼.
圖片驗證碼的主要關(guān)鍵是呈現(xiàn)圖片, 需要一個URL, 而這個URL需要傳遞參數(shù)以確定顯示什么東西.
這個驗證碼如何在服務(wù)器保存, 如何傳遞一個參數(shù)公開給客戶端, 還不能讓別人解密這個參數(shù)破解驗證碼, 都是麻煩事
這個例子是講述如何用極短的 "單頁" 代碼, 實現(xiàn)驗證過程.
先上圖:

再上代碼:
@page "/BlazorVerificationCode"
<p>
(Blazor) A sample for how to show verification code and verify it.
</p>
@inject IJSRuntime jsr
@{
if (imgurl == null) MakeNewImage();
}
<img style="border:solid 1px #ccc" 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" style="padding:5px" />
<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());
}
}
展現(xiàn)效果如下:

下面是解說
整個代碼只有 60 行.
已經(jīng)包含了,展示界面, 生成圖片,傳遞和測試驗證碼的各部分.
代碼先用隨機數(shù)確保生成 vericode = new Random().Next(100000, 999999).ToString();
然后根據(jù)vericode生成一個圖片, 轉(zhuǎn)換成base64格式到 imgurl 變量
最后通過 <img style="border:solid 1px #ccc" src="@imgurl" /> 呈現(xiàn)出來.
我上一篇隨筆有介紹, Blazor是'活'的, 是在服務(wù)器上生存著的.
<button @onclick="MakeNewImage">Renew</button> 在服務(wù)器上有活動的instance, 而在客戶端瀏覽器也有'鏡像副本'
當(dāng)瀏覽器的'鏡像副本'被用戶點擊后, Blazor就會把事件回傳給服務(wù)器, 觸發(fā)服務(wù)器還在運行中的 MakeNewImage
MakeNewImage 會重新生成新的 vericode 與 imgurl , 并且按照Blazor默認(rèn)行為, 會自動重新Render當(dāng)前控件的內(nèi)容, 所以 <img> 的 src 會被重新設(shè)置到新的imgurl , 展現(xiàn)新的圖片給用戶.
當(dāng)用戶在 <input type="text" @bind-value="inp_code" style="padding:5px" /> 輸入驗證碼后, Blazor會根據(jù)onchange事件, 把value發(fā)送到服務(wù)器, 根據(jù) @bind-value="inp_code" 這個配置, 把值保存到 inp_code 上.
當(dāng) <button>Check</button> 被按下后, OnSubmit="DoCheck" 會觸發(fā), 那么 DoCheck() 的代碼, 便可以判斷 inp_code == vericode 是否相同.
這個過程中, 和其他框架做法的最大不同是, Blazor 保持了服務(wù)器代碼運行的上下文, 因為上下文被保持了, 所以就不需要額外的傳遞了.
這就是為什么要 選擇 Blazor Server Side : 使用上下文來節(jié)省時間
最后:
如果把例子換成 發(fā)送短信/郵件驗證碼 , 原理是一樣的. 都無需利用其他代碼或資源去儲存?zhèn)鬟f驗證碼.
如果因任何原因, 頁面被刷新了, 那么這個內(nèi)存中的上下文就會釋放, 丟失, 驗證碼也失效, 需要重發(fā)重試.
如果是通常注冊后的郵件激活URL , 這個就不合適了. 需要找外部儲存激活URL相關(guān)的數(shù)據(jù).
以上就是[Asp.Net Core]用Blazor Server Side實現(xiàn)圖片驗證碼的詳細(xì)內(nèi)容,更多關(guān)于Blazor Server Side實現(xiàn)圖片驗證碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET網(wǎng)站模板的實現(xiàn)(第2節(jié))
這篇文章主要為大家詳細(xì)介紹了如何實現(xiàn)網(wǎng)站模板,了解母版頁在整合頁面公共元素、統(tǒng)一頁面風(fēng)格中的作用,感興趣的朋友可以參考下2015-08-08
Gridview使用CheckBox全選與單選采用js實現(xiàn)同時高亮顯示選擇行
Gridview使用CheckBox單選與全選功能再次進(jìn)行簡單演示,選中的行,使用高亮顯示,讓用戶一目了然看到哪一行被選擇了,在項目中很實用的,開發(fā)中的朋友們可要考慮一下哦2013-01-01
asp.net repeater實現(xiàn)批量刪除時注冊多選框id到客戶端
repeater批量刪除時注冊多選框id到客戶端的實現(xiàn)代碼2008-11-11
jquery中如何獲得服務(wù)器控件實現(xiàn)思路
jquery中如何獲得服務(wù)器控件,很多新手朋友對此比較陌生,接下來為您介紹解決方法,感興趣的朋友可以了解下哦2013-01-01
Repeater對數(shù)據(jù)進(jìn)行格式化處理
最近不止一個同學(xué),問我在Repeater里怎么格式化數(shù)據(jù),怎么處理。因為Repeater 屬于服務(wù)器端控件。要么利用本身的控件事件來處理,要么在數(shù)據(jù)源上處理。2013-03-03
asp.net 數(shù)據(jù)庫備份還原(sqlserver+access)
Asp.net 備份、還原Ms SQLServer及壓縮Access數(shù)據(jù)庫2008-11-11
C#調(diào)用C++版本dll時的類型轉(zhuǎn)換需要注意的問題小結(jié)
最近使用C#調(diào)用C++版本的dll遇到很多類型轉(zhuǎn)換的問題,現(xiàn)記錄出容易出錯的部分。2010-04-04

