asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
2017-03-20 09:15
746 查看
二话不说,来张效果图,给客官们看看:
WebForm5.aspx
GetValid.aspx
(可以直接将该页面作为源赋值给ImageUrl)
前台为空,后台代码如下:
ValidNums.aspx
(可以直接将该页面作为源赋值给ImageUrl)
前台为空,后台代码如下:
源码地址
WebForm5.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="TH.WebForm5" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> p { cursor: pointer; } </style> <script type="text/javascript"> function change() { document.getElementById("Image1").src = "GetValid.aspx?i=" + Math.random(); document.getElementById("Image2").src = "ValidNums.aspx?i=" + Math.random(); } </script> </head> <body> <form runat="server"> <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox> <asp:Label ID="Label1" runat="server" Text="Label" onclick="window.location.reload();"></asp:Label> <asp:Image ID="Image2" src="ValidNums.aspx" runat="server" /> <asp:Image ID="Image1" src="GetValid.aspx" runat="server" onclick="this.src='GetValid.aspx?time='+new Date()" /> <a href="javascript:void(0)" onclick="change()">看不清?重换一张</a> <div> <asp:Button ID="Button1" runat="server" Text="验证" OnClick="Button1_Click" /> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace TH { public partial class WebForm5 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string getNums = GetVali(); Label1.Text = getNums; } } /// <summary> /// 随机生成四位数 /// </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 Button1_Click(object sender, EventArgs e) { // if (Button1.Text == Session["ValidNums"].ToString()) // { // Response.Write("<script>alert('验证成功!')</script>"); // } // else // { // Response.Write("<script>alert('验证失败!')</script>"); // } //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.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; using System.Drawing; namespace TH { public partial class WebForm6 : 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(); } } }
源码地址
相关文章推荐
- asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
- asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
- asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
- 3种验证码示例(代码)(数字,数字字母混和,汉字)
- ASP.NET动态绘制汉字、字母和数字验证码
- asp.net 汉字转换拼音及首字母实现代码
- ASP.NET Core使用SkiaSharp实现验证码的示例代码
- asp.net 汉字转换拼音及首字母实现代码
- asp.net 汉字转换拼音及首字母实现代码
- 在ASP.NET下实现数字和字符相混合的验证码
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- 在ASP.NET下实现数字和字符相混合的验证码
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- 在ASP.NET下实现数字和字符相混合的验证码
- 在ASP.NET下实现数字和字符相混合的验证码