asp.net中3種驗證碼樣本(數字,數字字母混和,漢字)

來源:互聯網
上載者:User
效果:

Default.aspx

<table> <tr> <td class="style1">  (驗證碼測試)</td> <td>   <asp:Label ID="Label1" runat="server"></asp:Label>   <asp:Image ID="Image1" runat="server" Height="22px" ImageUrl="~/ValidNums.aspx" Width="58px" />  <asp:Image ID="Image2" runat="server" Height="22px" ImageUrl="~/GetValid.aspx" Width="58px" /></td> </tr> <tr> <td class="style1">   </td> <td>   <asp:Button ID="Button1" runat="server" Text="登入" OnClick="btnOK_Click" />    <asp:Button ID="Button2" runat="server" Text="取消" /> </td> </tr> </table>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { string getNums = GetVali(); Label1.Text = getNums; } } /// <summary> /// 隨機產生4位元 /// </summary> /// <returns>返回產生的隨機數</returns> public string GetVali() { string strsvali = "0,1,2,3,4,5,6,7,8,9"; string[] ValiArray = strsvali.Split(','); string ReturnNum = ""; int nums = -1; Random vrand = new Random(); for (int n = 1; n < 5; n++) { if (nums != -1) { vrand = new Random(n * nums * unchecked((int)DateTime.Now.Ticks)); } int t = vrand.Next(10); nums = t; ReturnNum += ValiArray[t]; } Session["Valid"] = ReturnNum; return ReturnNum; } protected void btnOK_Click(object sender, EventArgs e) { if (Session["Valid"].ToString() == TextBox3.Text) { ClientScript.RegisterStartupScript(this.GetType(),"ss","<script>alert('您已經成功通過登入驗證!')</script>"); } else { ClientScript.RegisterStartupScript(this.GetType(), "ss", "<script>alert('您輸入的驗證碼錯誤!')</script>"); } } }

GetValid.aspx
(可以直接將該頁面作為源賦值給ImageUrl)
前台為空白,後台代碼如下:

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Text; using System.Drawing; public partial class GetValid : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string validateNum = GetValids(); //成生4位隨機字串 CreateImage(validateNum); //將產生的隨機字串繪成圖片 Session["ValidNums"] = validateNum; //儲存驗證碼 } } public static string GetValids() { //擷取GB2312編碼頁(表) Encoding gb = Encoding.GetEncoding("gb2312"); //調用函數產生4個隨機中文漢字編碼 object[] bytes = CreateRegionCode(4); //根據漢字編碼的位元組數組解碼出中文漢字 string s = String.Empty; foreach (object byt in bytes) { string str1 = gb.GetString((byte[])Convert.ChangeType(byt, typeof(byte[]))); s = s + str1; } //輸出的控制台 return s; } public static object[] CreateRegionCode(int strlength) { //定義一個字串數組儲存漢字編碼的組成元素 string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; Random rnd = new Random(); //定義一個object數組用來 object[] bytes = new object[strlength]; /*每迴圈一次產生一個含兩個元素的十六進位位元組數組,並將其放入bject數組中 每個漢字有四個區位碼組成 區位碼第1位和區位碼第2位作為位元組數組第一個元素 區位碼第3位和區位碼第4位作為位元組數組第二個元素 */ for (int i = 0; i < strlength; i++) { //區位碼第1位 int r1 = rnd.Next(11, 14); string str_r1 = rBase[r1].Trim(); //區位碼第2位 rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i); //更換隨機數發生器的種子避免產生重複值 int r2; if (r1 == 13) { r2 = rnd.Next(0, 8); } else { r2 = rnd.Next(0, 16); } string str_r2 = rBase[r2].Trim(); //區位碼第3位 rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i); int r3 = rnd.Next(10, 16); string str_r3 = rBase[r3].Trim(); //區位碼第4位 rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i); int r4; if (r3 == 10) { r4 = rnd.Next(1, 16); } else if (r3 == 15) { r4 = rnd.Next(0, 15); } else { r4 = rnd.Next(0, 16); } string str_r4 = rBase[r4].Trim(); //定義兩個位元組變數儲存產生的隨機漢字區位碼 byte byte1 = Convert.ToByte(str_r1 + str_r2, 16); byte byte2 = Convert.ToByte(str_r3 + str_r4, 16); //將兩個位元組變數儲存在位元組數組中 byte[] str_r = new byte[] { byte1, byte2 }; //將產生的一個漢字的位元組數組放入object數組中 bytes.SetValue(str_r, i); } return bytes; } //產生圖片 private void CreateImage(string validateNum) { if (validateNum == null || validateNum.Trim() == String.Empty) return; //產生Bitmap映像 System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length * 12 + 10, 22); Graphics g = Graphics.FromImage(image); try { //產生隨機產生器 Random random = new Random(); //清空圖片背景色 g.Clear(Color.White); //畫圖片的背景雜音線 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Arial", 8); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateNum, font, brush, 2, 2); //畫圖片的前景噪音點 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); //將映像儲存到指定的流 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } }

ValidNums.aspx
(可以直接將該頁面作為源賦值給ImageUrl)
前台為空白,後台代碼如下:

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Drawing; public partial class ValidNums : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string validateNum = CreateRandomNum(4); //成生4位隨機字串 CreateImage(validateNum); //將產生的隨機字串繪成圖片 Session["ValidNums"] = validateNum; //儲存驗證碼 } } //產生隨機字串 private string CreateRandomNum(int NumCount) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z"; string[] allCharArray = allChar.Split(',');//拆分成數組 string randomNum = ""; int temp = -1;//記錄上次隨機數的數值,盡量避免產生幾個相同的隨機數 Random rand = new Random(); for (int i = 0; i < NumCount; i++) { if (temp != -1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(35); if (temp == t) { return CreateRandomNum(NumCount); } temp = t; randomNum += allCharArray[t]; } return randomNum; } //產生圖片 private void CreateImage(string validateNum) { if (validateNum == null || validateNum.Trim() == String.Empty) return; //產生Bitmap映像 System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length * 12 + 10, 22); Graphics g = Graphics.FromImage(image); try { //產生隨機產生器 Random random = new Random(); //清空圖片背景色 g.Clear(Color.White); //畫圖片的背景雜音線 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateNum, font, brush, 2, 2); //畫圖片的前景噪音點 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); //將映像儲存到指定的流 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } }

以上是3種驗證碼的全部代碼。
另外也可以使用ashx請求驗證碼的方式,本樣本僅使用Session存值處理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.