下面是 “asp.net 简单验证码验证实现代码”的完整攻略:
标题
1. 引入命名空间
使用验证码,需要在代码中引入System.Drawing和System.Drawing.Imaging两个命名空间。在aspx页面的头部引入这两个命名空间即可。
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
2. 编写验证码生成函数
public void CreateCheckCodeImage(int codeCount, int width, int height, Stream outputStream)
{
int fontSize = Math.Min(width / (codeCount + 1), height - 5); // 计算字体大小
Bitmap bmp = new Bitmap(width, height); // 创建画布
Graphics g = Graphics.FromImage(bmp); // 创建画布上下文
g.Clear(Color.White); // 填充画布背景色
g.SmoothingMode = SmoothingMode.HighQuality; // 设置抗锯齿
Random random = new Random(); // 创建随机数生成器
//生成干扰线条
for (int i = 0; i < 10; i++)
{
int x1 = random.Next(width);
int y1 = random.Next(height);
int x2 = random.Next(width);
int y2 = random.Next(height);
g.DrawLine(new Pen(Color.LightGray, 1), x1, y1, x2, y2);
}
string checkCode = string.Empty; // 保存验证码字符串
// 依次绘制每个字符
for (int i = 0; i < codeCount; i++)
{
// 生成一个随机数字或字母
int num = random.Next(36);
char code;
if (num < 10)
{
code = (char)('0' + num);
}
else
{
code = (char)('A' + num - 10);
}
checkCode += code.ToString(); //保存验证码字符
//随机生成字符的加粗、倾斜以及旋转角度等效果
float skewX = random.Next(0, 60) / 10f - 3f;
float skewY = random.Next(0, 40) / 10f - 2f;
float angle = random.Next(-10, 10);
// 计算字符绘制位置
PointF point = new PointF(fontSize * (i + 1) + random.Next(-2, 2), height / 2 + random.Next(-5, 5));
// 设置字符颜色
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
using (Font font = new Font(FontFamily.GenericSerif, fontSize, FontStyle.Bold))
using (Matrix mat = new Matrix(1, 0, 0, 1, 0, 0))
{
mat.Shear(skewX, skewY); // 设置剪切
mat.Rotate(angle); // 设置旋转角度
g.Transform = mat; // 应用变换矩阵
g.DrawString(code.ToString(), font, new SolidBrush(color), point); // 绘制字符
g.ResetTransform(); // 恢复矩阵
}
}
bmp.Save(outputStream, ImageFormat.Jpeg); // 输出图像
context.Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
g.Dispose(); // 释放资源
bmp.Dispose();
}
3. 在页面上使用
在需要验证码的页面创建一个“image”标签,在后台动态生成验证码并输出到该标签,同时将验证码字符串保存到会话中。
<asp:Image ID="imgCheckCode" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
MemoryStream ms = new MemoryStream(); //创建内存流
CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
Response.ClearContent(); // 清空输出流
Response.ContentType = "image/Jpeg"; //设置输出类型
Response.BinaryWrite(buffer); //输出图像
Response.End(); //停止输出
}
4. 验证用户输入
将用户输入的验证码字符串和之前保存在会话中的验证码字符串进行比较即可。
string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
{
//验证码错误
}
else
{
//验证码正确
}
示例说明
示例一
在登录页面中添加验证码,实现防止恶意攻击的效果。
<asp:TextBox ID="txtName" runat="server" />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" />
<asp:TextBox ID="txtCheckCode" runat="server" />
<asp:Image ID="imgCheckCode" runat="server" />
<asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />
在后台页面中生成验证码,并将验证码字符串和用户输入进行比较验证:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MemoryStream ms = new MemoryStream(); //创建内存流
CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
imgCheckCode.ImageUrl = "data:image/Jpeg;base64," + Convert.ToBase64String(buffer); //输出图像
Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
}
}
protected void btnLogin_Click(object sender, EventArgs e)
{
string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
{
//验证码错误
Response.Write("验证码错误");
}
else
{
//验证码正确,进行登录操作
//...
}
}
示例二
创建一个注册页面,在其中添加验证码,并将验证码的结果保存到数据库中。
<asp:TextBox ID="txtName" runat="server" />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" />
<asp:TextBox ID="txtCheckCode" runat="server" />
<asp:Image ID="imgCheckCode" runat="server" />
<asp:Button ID="btnRegister" runat="server" Text="注册" OnClick="btnRegister_Click" />
在后台页面中生成验证码,并将验证码字符串和用户输入进行比较验证,如果验证通过,则将用户名、密码和验证码字符串保存到数据库中。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MemoryStream ms = new MemoryStream(); //创建内存流
CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
imgCheckCode.ImageUrl = "data:image/Jpeg;base64," + Convert.ToBase64String(buffer); //输出图像
Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
}
}
protected void btnRegister_Click(object sender, EventArgs e)
{
string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
{
//验证码错误
Response.Write("验证码错误");
}
else
{
//验证码正确,将用户输入保存到数据库中
string name = txtName.Text.Trim();
string password = txtPassword.Text.Trim();
//保存到数据库中
//...
Response.Write("注册成功");
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net 简单验证码验证实现代码 - Python技术站