关于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 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());
} }

展现效果如下:


下面是解说

整个代码只有 60 行.

已经包含了,展示界面, 生成图片,传递和测试验证码的各部分.

代码先用随机数确保生成 vericode = new Random().Next(100000, 999999).ToString();

然后根据vericode生成一个图片, 转换成base64格式到 imgurl 变量

最后通过 <img style="border:solid 1px #ccc" 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" style="padding:5px" /> 输入验证码后,  Blazor会根据onchange事件, 把value发送到服务器, 根据 @bind-value="inp_code" 这个配置, 把值保存到 inp_code 上.

当 <button>Check</button> 被按下后,  OnSubmit="DoCheck" 会触发,  那么 DoCheck() 的代码, 便可以判断 inp_code == vericode 是否相同.

这个过程中, 和其他框架做法的最大不同是, Blazor 保持了服务器代码运行的上下文, 因为上下文被保持了, 所以就不需要额外的传递了.

这就是为什么要   选择 Blazor Server Side (一)   :  使用上下文来节省时间

最后:

如果把例子换成 发送短信/邮件验证码 , 原理是一样的. 都无需利用其他代码或资源去储存传递验证码.

如果因任何原因, 页面被刷新了, 那么这个内存中的上下文就会释放, 丢失, 验证码也失效, 需要重发重试.

如果是通常注册后的邮件激活URL , 这个就不合适了. 需要找外部储存激活URL相关的数据.

最新文章

  1. LINUX下YUM源配置
  2. 【转】理解 PHP 依赖注入 | Laravel IoC容器
  3. [BZOJ3874][AHOI2014] 宅男计划
  4. Entity Framework中IQueryable, IEnumerable, IList的区别
  5. A*啦啦啦
  6. cmd打开控制面板及其他命令
  7. 找不到类型或命名空间 datarowview
  8. jdbc_连接数据库
  9. openStack ceilometer API
  10. lastIndexOf方法——获取字符最后的索引
  11. frame、bounds表示大小和位置的属性以及center、position、anchorPosition
  12. javascript中函数声明与函数表达式的区别
  13. linkin大话数据结构--apache commons工具类
  14. CSAPP:第一章学习笔记:斗之气1段
  15. Android 开发 PopupWindow弹窗
  16. c# LINQ 使用
  17. java之面向对象的基础知识
  18. React创建组件的不同方式(ES5 &amp; ES6)
  19. Spark/Storm/Flink
  20. swift 关于didSet 和willSet赋值的注意点

热门文章

  1. webstorm 提示 &quot;scanning files to index...&quot; 一直不能编译的问题
  2. SQLyog试用到期的解决方法(仅供个人学习使用,禁止转载或用于商业盈利)
  3. 微服务优化之使用gRPC做微服务的内部通信
  4. sentinel 规则持久化到nacos
  5. web实验二 ---通过jQuery实现用户注册身份验证
  6. css 一行自适应等比例布局
  7. RPA如何跑赢传统自动化和人工?
  8. js中的堆和栈
  9. 《自拍教程45》Python_adb实时监控Logcat日志
  10. 多个文件名大小写不同,是因为运行代码是大写E,用vscode运行的是小写e,解决方案:手动npm run dev #There are multiple modules with names that only differ in casing.