溫馨提示×

溫馨提示×

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

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

[Asp.Net Core]怎么用Blazor Server Side實現(xiàn)圖片驗證碼功能

發(fā)布時間:2021-03-08 14:22:21 來源:億速云 閱讀:158 作者:TREX 欄目:開發(fā)技術(shù)

這篇文章主要講解了“[Asp.Net Core]怎么用Blazor Server Side實現(xiàn)圖片驗證碼功能”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“[Asp.Net Core]怎么用Blazor Server Side實現(xiàn)圖片驗證碼功能”吧!

關(guān)于Blazor

由于在國內(nèi), Blazor一點都不普及, 在閱讀此文前, 建議讀者先翻看我之前寫的隨筆, 了解Blazor Server Side的特點.

在一段時間內(nèi), 我會寫一些解說分析型的 "為什么選擇 Blazor Server Side" , 在適當?shù)臅r候再寫快速入門系列.(無論是針對編程新學者還是多年經(jīng)驗人士)

驗證碼

我們很多場合都實現(xiàn)過圖片驗證碼.

圖片驗證碼的主要關(guān)鍵是呈現(xiàn)圖片, 需要一個URL, 而這個URL需要傳遞參數(shù)以確定顯示什么東西.

這個驗證碼如何在服務器保存, 如何傳遞一個參數(shù)公開給客戶端, 還不能讓別人解密這個參數(shù)破解驗證碼, 都是麻煩事

這個例子是講述如何用極短的 "單頁" 代碼, 實現(xiàn)驗證過程.

先上圖:

[Asp.Net Core]怎么用Blazor Server Side實現(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  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());
 }

}

展現(xiàn)效果如下:

[Asp.Net Core]怎么用Blazor Server Side實現(xiàn)圖片驗證碼功能

下面是解說

整個代碼只有 60 行.

已經(jīng)包含了,展示界面, 生成圖片,傳遞和測試驗證碼的各部分.

代碼先用隨機數(shù)確保生成 vericode = new Random().Next(100000, 999999).ToString();

然后根據(jù)vericode生成一個圖片, 轉(zhuǎn)換成base64格式到 imgurl 變量

最后通過 <img  src="@imgurl" /> 呈現(xiàn)出來.

我上一篇隨筆有介紹,  Blazor是'活'的, 是在服務器上生存著的.

<button @onclick="MakeNewImage">Renew</button> 在服務器上有活動的instance, 而在客戶端瀏覽器也有'鏡像副本'

當瀏覽器的'鏡像副本'被用戶點擊后, Blazor就會把事件回傳給服務器, 觸發(fā)服務器還在運行中的 MakeNewImage

MakeNewImage 會重新生成新的 vericode 與 imgurl , 并且按照Blazor默認行為, 會自動重新Render當前控件的內(nèi)容,  所以 <img> 的 src 會被重新設置到新的imgurl , 展現(xiàn)新的圖片給用戶.

當用戶在 <input type="text" @bind-value="inp_code"  /> 輸入驗證碼后,  Blazor會根據(jù)onchange事件, 把value發(fā)送到服務器, 根據(jù) @bind-value="inp_code" 這個配置, 把值保存到 inp_code 上.

<button>Check</button> 被按下后,  OnSubmit="DoCheck" 會觸發(fā),  那么 DoCheck() 的代碼, 便可以判斷 inp_code == vericode 是否相同.

這個過程中, 和其他框架做法的最大不同是, Blazor 保持了服務器代碼運行的上下文, 因為上下文被保持了, 所以就不需要額外的傳遞了.

這就是為什么要   選擇 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)圖片驗證碼功能”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對[Asp.Net Core]怎么用Blazor Server Side實現(xiàn)圖片驗證碼功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

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

AI