小巧方便的MVC後端驗證碼,供大家學習借鑒

来源:http://www.cnblogs.com/zhao521/archive/2016/06/03/5556198.html
-Advertisement-
Play Games

以上文章由本文作者根據網路上其它的例子學習整合再加上自己的思想凝聚而成,如有侵犯請聯繫本人,速刪 ...


調用:

public ActionResult Vcode()//驗證碼
{

  string code = ValidateCode.CreateRandomCode(4);

  ValidateCode.CreateImage(code);

  Session["vcode"] = code.ToLower();//存入session供驗證用

  System.IO.MemoryStream ms = new System.IO.MemoryStream();

  return File(ms.GetBuffer(), "image/JPEG");

}

//下麵是主題class內部

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Web;

namespace xxxxxx.Models//命名空間自己填咯
{
public class ValidateCode
{
public static string CreateRandomCode(int length)
{
int rand;
char code;
string randomcode = String.Empty;
//生成一定長度的驗證碼
System.Random random = new Random();
for (int i = 0; i < length; i++)
{
rand = random.Next();
if (rand % 3 == 0)
{
code = (char)('A' + (char)(rand % 26));//如果是3的倍數就除以26將餘數(小於26)轉換成大寫字母
}
else if (rand % 7 == 0)
{
code = (char)('a' + (char)(rand % 26));
}
else
{
code = (char)('0' + (char)(rand % 10));
}
randomcode += code.ToString();
}

return randomcode;
}
public static void CreateImage(string randomcode)
{
int randAngle = 30; //隨機轉動角度範圍
int mapwidth = (int)(randomcode.Length * 23);//背景的寬度,此值是你輸入要求的字元長度的23倍大(4*23=92寬)
using (Bitmap map = new Bitmap(mapwidth, 28))//創建圖片背景,寬為(4*28),高為28的畫布,從右上角(0,0)處開始;
{
Random rand = new Random();//隨機數實例
using (Bitmap temp = new Bitmap(map.Width, map.Height))//臨時畫布
{
using (Graphics tempGra = Graphics.FromImage(temp))
{
char[] chars = randomcode.ToCharArray();//拆散字元串成單字元數組
StringFormat format = new StringFormat(StringFormatFlags.NoClip);//定義文字格式
format.Alignment = StringAlignment.Center;//文字距中
format.LineAlignment = StringAlignment.Center;
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //定義顏色
string[] fontList = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" };//定義字體
for (int i = 0; i < chars.Length; i++)//逐個繪製文字
{
int cindex = rand.Next(7);//顏色隨機數
int findex = rand.Next(5);//字體隨機數
Font font = new System.Drawing.Font(fontList[findex], 13, System.Drawing.FontStyle.Bold);//字體樣式(參數2為字體大小)
Brush brush = new System.Drawing.SolidBrush(c[cindex]);//文字顏色1
//Brush brushPen = new LinearGradientBrush(new Rectangle(0, 0, temp.Width, temp.Height), Color.FromArgb(rand.Next(0, 256), 0, 0), Color.FromArgb(0, 0, rand.Next(0, 256)), rand.Next(90));//文字顏色2漸變
Point dot = new Point(16, 14);//定義一個點
//graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//測試X坐標顯示間距的
float angle = rand.Next(-randAngle, randAngle);//轉動的度數
tempGra.TranslateTransform(dot.X, dot.Y);//更改坐標系的原點(所有的操作在此原點(16,16))
tempGra.RotateTransform(angle);//旋轉畫布
//Matrix m = new Matrix();//創建變換
//m.RotateAt(angle, new PointF(16, 16), MatrixOrder.Append);//旋轉
//m.Shear(rand.Next(-10, 10) * 0.03f, 0);//扭曲
//tempGra.Transform = m;//畫布應用變換
tempGra.DrawString(chars[i].ToString(), font, brush, 1, 1, format);//開始畫字母或文字
tempGra.RotateTransform(-angle);//轉回去
tempGra.TranslateTransform(4, -dot.Y);//更改坐標系的原點
}
}
using (Graphics graph = Graphics.FromImage(map))//創建目標畫布;
{
graph.Clear(Color.AliceBlue);//清除畫面,填充背景
Rectangle rect = new Rectangle(0, 0, map.Width, map.Height);//繪製漸變背景
Brush brushBack = new LinearGradientBrush(rect, Color.FromArgb(rand.Next(150, 256), 255, 255), Color.FromArgb(255, rand.Next(150, 256), 255), rand.Next(90));//漸變背景顏色
graph.FillRectangle(brushBack, rect);//背景填充到畫布
graph.DrawRectangle(new Pen(Color.LightPink, 0), 0, 0, map.Width - 1, map.Height - 1);//畫一個邊框,預設是從屏幕右上角(0,0)初開始畫
//graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//圖片抗鋸齒模式

Pen blackPen = new Pen(Color.LightGray, 0);//筆觸顏色
for (int i = 0; i < 50; i++)//噪點50個
{
int x = rand.Next(1, map.Width - 3);
int y = rand.Next(1, map.Height - 3);
graph.DrawRectangle(blackPen, x, y, 1, 1);//生成噪點
}
graph.DrawImage(temp, new Point(0, 0));//先畫點後畫圖
Pen pen = new Pen(Color.Gray, 1);//干擾線筆觸
for (int i = 0; i < 2; i++)//繪製兩條幹擾線
{
Point p1 = new Point(0, rand.Next(map.Height));
Point p2 = new Point(rand.Next(map.Width), rand.Next(map.Height));
Point p3 = new Point(rand.Next(map.Width), rand.Next(map.Height));
Point p4 = new Point(map.Width, rand.Next(map.Height));
Point[] p = { p1, p2, p3, p4 };
graph.DrawBeziers(pen, p);
}
System.IO.MemoryStream ms = new System.IO.MemoryStream();
map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/gif";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
temp.Dispose();//釋放
graph.Dispose();
map.Dispose();
}
}
}

}
}
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網站數據分析沒有規範的分析流程容易使最後的結果邏輯混亂或者偏離原來的主題,所以一套規範的流程能夠使網站分析更加清晰和有效。 網站分析其實就是一個發現問題、分析問題的解決問題的過程。問題的發現可以來源於多方面:網站運營中遇到的問題、用戶的反饋和抱怨、日常統計數據的表現異常等;分析問題的過程就是根據遇到 ...
  • 隨著人工智慧(AI)技術對各行各業有越來越深入的影響,我們也更多地在新聞或報告中聽到“機器學習”、“深度學習”、“增強學習”、“神經網路”等辭彙,對於非專業人士來說略為玄幻。這篇文章為讀者梳理了包括這些在內的12個關鍵詞,希望幫助讀者更清晰地理解,這項人工智慧技術的內涵和潛能。 1、 機器學習 湯姆 ...
  • 這幾天一直在搞linux下麵的.net mvc的部署工作,遇到了很多問題,還好有一些朋友的幫助,問題才得到瞭解決! 環境:Linux+Mongo+Jexus 希望的結果:直接運行windows+vistualstudio開發的MVC網站 遇到的問題:可以解析,但出現一些運行時(CLR)的錯誤 截圖 ...
  • 關於Linux的資源我瞭解還是比較少的,因為我最討厭用命令行了(那是我大學時代的陰影啊!)。這個資源收集很久了一直沒有分享出來,因為我對Linux的瞭解真的很少,不知道怎麼去描述,但是今天分享出來我想讓跟我一樣不太懂的和想學習一下Linux的小伙伴一起學習。 直接點擊小就可以下載哦! ├─lesso ...
  • .\usb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb-driver\STM32_U ...
  • 很久沒用筆記本上的ubuntu,用不順手,比在公司調教了半年多的電腦差遠了。一步一步來。先解決最不順手的三件事 1.su認證失敗。 新安裝的ubuntu系統是無法切換到root賬戶的,得做一番修改 sudo passwd 密碼: 輸入新的UNIX密碼: 確認密碼: 這樣就可以了 2.文件夾里打開終端 ...
  • 介紹 comm命令可以對兩個已排序好的文本的內容進行交集和差集的對比,記住必須是已排序過的文件;可以使用sort命令對沒有排序的文件進行排序,comm命令在對比結果中會產生三列分別是:在A中不在B中的內容,在B中不在A中的內容,AB的交集的內容。 事例 [root@localhost test]# ...
  • 作為一個菜鳥,對於SSL證書,我瞭解不多,只知道用了它網站更安全,所以這次使用SSL證書途中遇到各方面的各種問題,到今天為止終於全部解決。 一、證書格式 前兩天在那什麼雲上面買了個SSL證書,是WoSign的,證書簽發後下載下來有兩個文件,.pem和.key,查詢得知IIS需要.pfx格式的證書文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...