下面我会详细讲解“基于ASP.NET实现验证码生成”的完整攻略。
什么是验证码(CAPTCHA)?
验证码(CAPTCHA),全称为 Completely Automated Public Turing test to tell Computers and Humans Apart,是一种用于区分计算机和人类的测试。一般用于抵御自动化的恶意攻击和垃圾信息。常见的验证码包括图像、声音、文字等形式。
用ASP.NET如何生成简单图形验证码?
在ASP.NET中,我们可以使用System.Drawing命名空间提供的Graphics类和Bitmap类,创建一个简单的图形验证码。下面是一个简单的ASP.NET页面,用于生成一个包含四位随机字符的图形验证码。
<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string captcha = RandomString(4);
this.Session["captcha"] = captcha; //将验证码存入Session中,以便后续验证
DrawImage(captcha);
}
protected void Page_Unload(object sender, EventArgs e)
{
//清除缓存
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetNoStore();
}
//生成随机字符
private string RandomString(int n)
{
string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random rd = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++)
{
sb.Append(chars[rd.Next(chars.Length)]);
}
return sb.ToString();
}
//绘制图像
private void DrawImage(string text)
{
Bitmap bmp = new Bitmap(100, 40);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
Font font = new Font("Arial", 24);
Brush brush = new SolidBrush(Color.Black);
g.DrawString(text, font, brush, 10, 5);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Png);
Response.ContentType = "image/png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
bmp.Dispose();
}
</script>
该页面的代码逻辑很简单,首先在Page_Load事件中生成一个包含四位随机字符的字符串,并将其存入Session中以便后续验证。然后利用Graphics类和Bitmap类绘制一个包含随机字符的图像,并将该图像以PNG格式输出给浏览器显示。同时,我们还在Page_Unload事件中清空缓存。
用ASP.NET如何实现基于字符的验证码?
基于字符的验证码,一般是将随机生成的字符绘制在图像上,并添加一些干扰线、干扰点等辅助图形,以增强验证码的识别难度。下面是一个基于字符的验证码生成示例代码。
<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string captcha = RandomString(4);
this.Session["captcha"] = captcha;
DrawImage(captcha);
}
protected void Page_Unload(object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetNoStore();
}
private string RandomString(int n)
{
string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random rd = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++)
{
sb.Append(chars[rd.Next(chars.Length)]);
}
return sb.ToString();
}
private void DrawImage(string text)
{
Bitmap bmp = new Bitmap(120, 50);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);//清除画面,填充背景色
Random rd = new Random(Guid.NewGuid().GetHashCode());//随机数产生器
int randAngle = rd.Next(-45, 45);//随机转动角度
float x = -18;
float y = 0;
for (int i = 0; i < text.Length; i++)
{
//绘制字符
Font font = new Font("Arial", 30 + rd.Next(3), FontStyle.Bold);
Brush brush = new SolidBrush(Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
g.RotateTransform(randAngle);//对字符进行角度旋转或倾斜
g.DrawString(text[i].ToString(), font, brush, x + (i * 30), y);
g.RotateTransform(-randAngle);//对字符进行反向旋转或倾斜
//绘制干扰线
Pen pen = new Pen(Color.Silver, 2);
int x1 = rd.Next(bmp.Width);
int y1 = rd.Next(bmp.Height);
int x2 = rd.Next(bmp.Width);
int y2 = rd.Next(bmp.Height);
g.DrawLine(pen, x1, y1, x2, y2);
//绘制干扰点
pen = new Pen(Color.Gray, 2);
for (int j = 0; j < 50; j++)
{
int x0 = rd.Next(bmp.Width);
int y0 = rd.Next(bmp.Height);
bmp.SetPixel(x0, y0, Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
}
}
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Png);
Response.ContentType = "image/png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
bmp.Dispose();
}
</script>
该页面的代码逻辑比较复杂,主要分为以下三个部分:
1.生成随机字符串:利用Random类产生指定长度的随机字符串。
2.生成验证码图片:使用Graphics类和Bitmap类绘制验证码图片。该过程主要可以分为绘制字符和绘制干扰线、干扰点两个部分。
3.输出验证码图片:利用Response对象将验证码图片输出到浏览器。
以上就是“基于ASP.NET实现验证码生成”的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ASP.NET实现验证码生成详解 - Python技术站