Asp.net實(shí)現(xiàn)手寫(xiě)驗(yàn)證碼的操作代碼
引文:眾所周知,一般我們?nèi)粘E龅降尿?yàn)證碼是一個(gè)圖形樣式的,列入這個(gè)樣子的,那么在這個(gè)圖片里面我們想實(shí)現(xiàn)我們自己界面上有這樣的一個(gè)驗(yàn)證碼就需要做兩個(gè)操作,一個(gè)是在我們自己界面上生成如圖所示的一個(gè)驗(yàn)證碼圖片,第二個(gè)操作就是將驗(yàn)證碼里面的字符和用戶(hù)輸入的字符對(duì)比。


首先我們來(lái)實(shí)現(xiàn)生成 生成驗(yàn)證碼的這一部分,這時(shí)候我們需要封裝一個(gè)類(lèi),里面有生成圖片和字符的方法,其實(shí)本質(zhì)上就是一個(gè)隨機(jī)數(shù),這個(gè)類(lèi)卸載Model里面即可
public class CaptchaGenerator
{
string ocode;
// 可選字符集合
string letters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random random = new Random();
public string ConductOrginalcode() {
for (int i = 0; i < 4; i++)
{
ocode += letters[random.Next(letters.Length)];
}
return ocode;
}
public string GenerateCaptchaCode()
{
return ocode;
}
public string GenerateCaptchaImage()
{
// 驗(yàn)證碼圖片的尺寸
const int WIDTH = 60;
const int HEIGHT = 30;
// 創(chuàng)建Bitmap對(duì)象
Bitmap bitmap = new Bitmap(WIDTH, HEIGHT);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
// 生成四位驗(yàn)證碼
string code ;
code = ocode;
// 繪制干擾線(xiàn)
for (int i = 0; i < 20; i++)
{
int x1 = random.Next(bitmap.Width);
int y1 = random.Next(bitmap.Height);
int x2 = random.Next(bitmap.Width);
int y2 = random.Next(bitmap.Height);
graphics.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
}
// 繪制干擾點(diǎn)
for (int i = 0; i < 200; i++)
{
int x = random.Next(bitmap.Width);
int y = random.Next(bitmap.Height);
bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
}
// 繪制邊框
graphics.DrawRectangle(new Pen(Color.Black), new Rectangle(0, 0, bitmap.Width - 1, bitmap.Height - 1));
// 使用漸變畫(huà)刷填充驗(yàn)證碼文本
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Color.Blue, Color.Green, 1.4f);
graphics.DrawString(code, new Font("宋體", 20), linearGradientBrush, new PointF(0, 0));
// 將Bitmap轉(zhuǎn)換為MemoryStream,并進(jìn)一步轉(zhuǎn)換為Base64字符串
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageBytes = ms.ToArray();
ms.Close();
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}這個(gè)類(lèi)里面包含了三個(gè)方法第一個(gè)是生成隨機(jī)數(shù),第二個(gè)是生成字符的,第三個(gè)是根據(jù)字符來(lái)生成對(duì)應(yīng)的圖片
然后我們需要在我們需要的控制器里面調(diào)用這個(gè)類(lèi),用戶(hù)比較的時(shí)候就拿第二個(gè)方法里面的字符去比較就可以了
// GET: GuestBook
public ActionResult Index(int? page)
{
// 生成驗(yàn)證碼
Session.Remove("CaptchaCode");
CaptchaGenerator captchaGenerator = new CaptchaGenerator();
captchaGenerator.ConductOrginalcode();
string captchaBase64 = captchaGenerator.GenerateCaptchaImage();
string captchaText = captchaGenerator.GenerateCaptchaCode();
ViewBag.CaptchaImage = $"data:image/jpeg;base64,{captchaBase64}";
Session["CaptchaCode"] = captchaText;
int pageIndex = page ?? 2; // 新的初始頁(yè)碼
int pageSize = 2; // 新的每頁(yè)大小
var guestBookQuery = from gb in db.GuestBooks
orderby gb.AddDate descending
select gb;
/* Webdiyer.WebControls.Mvc.IPagedList<GuestBook> p1 = new Webdiyer.WebControls.Mvc.PagedList<GuestBook>(guestBookQuery.ToList(), pageIndex, pageSize);*/
PagedList.IPagedList<GuestBook> p1 = guestBookQuery.ToPagedList(pageIndex, pageSize);
return View(p1);
}然后需要的是在這個(gè)控制器里面我們還要寫(xiě)一個(gè)刷新驗(yàn)證碼的方法,保證驗(yàn)證碼錯(cuò)誤和輸入正確之后都要刷新一遍.
private void RefreshCaptcha()
{
Session.Remove("CaptchaCode");
CaptchaGenerator captchaGenerator = new CaptchaGenerator();
captchaGenerator.ConductOrginalcode();
string captchaBase64 = captchaGenerator.GenerateCaptchaImage();
string captchaText = captchaGenerator.GenerateCaptchaCode();
ViewBag.CaptchaImage = $"data:image/jpeg;base64,{captchaBase64}";
Session["CaptchaCode"] = captchaText;
} <tr>
<div style="display:flex;margin-left:10px;left:20%">
<img src="@ViewBag.CaptchaImage" alt="驗(yàn)證碼" />
<input style="margin-left:13px" type="text" name="captcha" />
</div>
</tr>在視圖里面添加這個(gè)關(guān)于驗(yàn)證碼的
[HttpPost]
public ActionResult Index(GuestBook guestBook,string captcha)
{
if (Session["CaptchaCode"] != null && captcha != null)
{
string captchaSessionValue = Session["CaptchaCode"] as string;
if (captchaSessionValue == captcha)
{
}
else
{
return Content("<script>alert('驗(yàn)證碼輸入錯(cuò)誤');window.location.href='/GuestBook/Index';</script>");
}
}
RefreshCaptcha();
int pageSize = 2;
if (ModelState.IsValid)
{
guestBook.AddDate = DateTime.Now;
db.GuestBooks.Add(guestBook);
db.SaveChanges();
ModelState.Clear();
}
var guestBookQuery = from gb in db.GuestBooks
orderby gb.AddDate descending
select gb;
PagedList.IPagedList<GuestBook> p1 = guestBookQuery.ToPagedList(1, pageSize);
return View(p1);
}然后在表單驗(yàn)證的時(shí)候進(jìn)行驗(yàn)證碼和用戶(hù)輸入的字符進(jìn)行比對(duì)即可
到此這篇關(guān)于asp.net實(shí)現(xiàn)手寫(xiě)驗(yàn)證碼的文章就介紹到這了,更多相關(guān)asp.net手寫(xiě)驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Asp.net Web Api實(shí)現(xiàn)圖片點(diǎn)擊式圖片驗(yàn)證碼功能
- asp.net點(diǎn)選驗(yàn)證碼實(shí)現(xiàn)思路分享 (附demo)
- ASP.NET中畫(huà)圖形驗(yàn)證碼的實(shí)現(xiàn)代碼
- Asp.net開(kāi)發(fā)之webform圖片水印和圖片驗(yàn)證碼的實(shí)現(xiàn)方法
- asp.net登錄驗(yàn)證碼實(shí)現(xiàn)方法
- asp.net之生成驗(yàn)證碼的方法集錦(一)
- 如何使用ASP.NET制作簡(jiǎn)單的驗(yàn)證碼
- asp.net驗(yàn)證碼圖片生成示例
- ASP.NET 實(shí)現(xiàn)驗(yàn)證碼以及刷新驗(yàn)證碼的小例子
相關(guān)文章
WPF集合控件實(shí)現(xiàn)分隔符(ItemsControl Separator)
這篇文章主要為大家詳細(xì)介紹了WPF集合控件實(shí)現(xiàn)分隔符ItemsControl Separator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
asp.net2.0如何加密數(shù)據(jù)庫(kù)聯(lián)接字符串
asp.net2.0如何加密數(shù)據(jù)庫(kù)聯(lián)接字符串...2006-09-09
.NET中創(chuàng)建對(duì)象的幾種方式和對(duì)比
在 .net 中,創(chuàng)建一個(gè)對(duì)象最簡(jiǎn)單的方法是直接使用 new (), 在實(shí)際的項(xiàng)目中可能還會(huì)用到反射,本文就介紹了幾種創(chuàng)建方法,感興趣的可以了解一下2021-07-07
jQuery+Ajax用戶(hù)登錄功能的實(shí)現(xiàn)
前幾天把jbox源碼修改成仿QQ空間模擬窗口后發(fā)現(xiàn)有很多人在關(guān)注。今天就貼一下我利用該模擬窗口實(shí)現(xiàn)的用戶(hù)登錄功能的代碼。2009-11-11
.Net與JS時(shí)間日期格式的轉(zhuǎn)換問(wèn)題對(duì)比分析
這篇文章主要介紹了.Net與JS時(shí)間日期格式的轉(zhuǎn)換問(wèn)題,結(jié)合實(shí)例形式對(duì)比分析了JS與.Net針對(duì)時(shí)間日期格式的轉(zhuǎn)換處理相關(guān)技巧,需要的朋友可以參考下2016-08-08
Asp.Net Core輕量級(jí)Aop解決方案:AspectCore
這篇文章主要介紹了Asp.Net Core輕量級(jí)Aop解決方案:AspectCore,需要的朋友可以參考下2017-06-06
ASP.NET實(shí)現(xiàn)級(jí)聯(lián)下拉框效果實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了ASP.NET實(shí)現(xiàn)級(jí)聯(lián)下拉框效果實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09

