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


首先我們來實現(xiàn)生成 生成驗證碼的這一部分,這時候我們需要封裝一個類,里面有生成圖片和字符的方法,其實本質(zhì)上就是一個隨機數(shù),這個類卸載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()
{
// 驗證碼圖片的尺寸
const int WIDTH = 60;
const int HEIGHT = 30;
// 創(chuàng)建Bitmap對象
Bitmap bitmap = new Bitmap(WIDTH, HEIGHT);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
// 生成四位驗證碼
string code ;
code = ocode;
// 繪制干擾線
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);
}
// 繪制干擾點
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));
// 使用漸變畫刷填充驗證碼文本
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,并進一步轉(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;
}
}這個類里面包含了三個方法第一個是生成隨機數(shù),第二個是生成字符的,第三個是根據(jù)字符來生成對應(yīng)的圖片
然后我們需要在我們需要的控制器里面調(diào)用這個類,用戶比較的時候就拿第二個方法里面的字符去比較就可以了
// GET: GuestBook
public ActionResult Index(int? page)
{
// 生成驗證碼
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; // 新的初始頁碼
int pageSize = 2; // 新的每頁大小
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);
}然后需要的是在這個控制器里面我們還要寫一個刷新驗證碼的方法,保證驗證碼錯誤和輸入正確之后都要刷新一遍.
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="驗證碼" />
<input style="margin-left:13px" type="text" name="captcha" />
</div>
</tr>在視圖里面添加這個關(guā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('驗證碼輸入錯誤');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);
}然后在表單驗證的時候進行驗證碼和用戶輸入的字符進行比對即可
到此這篇關(guān)于asp.net實現(xiàn)手寫驗證碼的文章就介紹到這了,更多相關(guān)asp.net手寫驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WPF集合控件實現(xiàn)分隔符(ItemsControl Separator)
這篇文章主要為大家詳細介紹了WPF集合控件實現(xiàn)分隔符ItemsControl Separator,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
asp.net2.0如何加密數(shù)據(jù)庫聯(lián)接字符串
asp.net2.0如何加密數(shù)據(jù)庫聯(lián)接字符串...2006-09-09
Asp.Net Core輕量級Aop解決方案:AspectCore
這篇文章主要介紹了Asp.Net Core輕量級Aop解決方案:AspectCore,需要的朋友可以參考下2017-06-06
ASP.NET實現(xiàn)級聯(lián)下拉框效果實例講解
這篇文章主要為大家詳細介紹了ASP.NET實現(xiàn)級聯(lián)下拉框效果實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09

