Asp.net實現手寫驗證碼的操作代碼
引文:眾所周知,一般我們日常碰到的驗證碼是一個圖形樣式的,列入這個樣子的,那么在這個圖片里面我們想實現我們自己界面上有這樣的一個驗證碼就需要做兩個操作,一個是在我們自己界面上生成如圖所示的一個驗證碼圖片,第二個操作就是將驗證碼里面的字符和用戶輸入的字符對比。
首先我們來實現生成 生成驗證碼的這一部分,這時候我們需要封裝一個類,里面有生成圖片和字符的方法,其實本質上就是一個隨機數,這個類卸載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轉換為MemoryStream,并進一步轉換為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; } }
這個類里面包含了三個方法第一個是生成隨機數,第二個是生成字符的,第三個是根據字符來生成對應的圖片
然后我們需要在我們需要的控制器里面調用這個類,用戶比較的時候就拿第二個方法里面的字符去比較就可以了
// 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>
在視圖里面添加這個關于驗證碼的
[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); }
然后在表單驗證的時候進行驗證碼和用戶輸入的字符進行比對即可
到此這篇關于asp.net實現手寫驗證碼的文章就介紹到這了,更多相關asp.net手寫驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
WPF集合控件實現分隔符(ItemsControl Separator)
這篇文章主要為大家詳細介紹了WPF集合控件實現分隔符ItemsControl Separator,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Asp.Net Core輕量級Aop解決方案:AspectCore
這篇文章主要介紹了Asp.Net Core輕量級Aop解決方案:AspectCore,需要的朋友可以參考下2017-06-06