asp.net 生成验证码问题

有道无术 2012-12-26 11:52:15
我从网上找了一个类。

我该怎么用呢,我现在后台登陆页面放了一个image控件,我想让验证码显示在上面。。

还有验证验证码的正确与否。。




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Web.UI;
using System.Drawing.Drawing2D;
using System.IO;
using System.Drawing.Imaging;

/// <summary>
///ValidateNumber 生成验证码
/// </summary>
public class ValidateNumber
{
//产生验证码的字符集 (易混淆的字符去掉)
private string charcode = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,R,S,U,W,X,Y,a,b,c,d,e,f,g,h,j,k,m,n,p,r,s,u,w,x,y";

/// <summary>
/// 验证码的最大长度
/// </summary>
public int MaxLength
{
get { return 10; }
}

/// <summary>
/// 验证码的最小长度
/// </summary>
public int MinLength
{
get { return 1; }
}

/// <summary>
/// 生成验证码
/// </summary>
/// <param name="length">指定验证码的长度</param>
/// <returns></returns>
public string CreateValidateNumber(int length)
{
string[] CharArray = charcode.Split(',');//将字符串转换为字符数组
string randomCode = "";
int temp = -1;

Random rand = new Random();
for (int i = 0; i < length; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(CharArray.Length - 1);
if (temp != -1 && temp == t)
{
return CreateValidateNumber(length);
}
temp = t;
randomCode += CharArray[t];
}
return randomCode;
}

/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="context">context对象</param>
/// <param name="validateNum">验证码</param>
public void CreateValidateGraphic(HttpContext context,string validateNum)
{
int iwidth = (int)(validateNum.Length * 14);
Bitmap image = new Bitmap(iwidth, 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.Silver), x1, y1, x2, y2);
}
Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateNum, font, brush, 3, 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);
//保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
//输出图片
context.Current.Response.ClearContent();
context.Current.ContentType = "image/jpeg";
context.Current.BinaryWrite(stream.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}

}
/// <summary>
/// 得到验证码图片的长度
/// </summary>
/// <param name="validateNumLength">验证码的长度</param>
/// <returns></returns>
public static int GetImageWidth(int validateNumLength)
{
return (int)(validateNumLength * 14);
}
/// <summary>
/// 得到验证码图片的高度
/// </summary>
/// <returns></returns>
public static double GetImageHeight()
{
return 22;
}
}



...全文
124 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xBoady 2012-12-26
  • 打赏
  • 举报
回复
哈哈 基本上类似
Junny 2012-12-26
  • 打赏
  • 举报
回复
引用 1 楼 junzhang4008 的回复:
前台:XML/HTML code?123456 <TR height=30> <TD>验证码:</TD> <TD vAlign=center colSpan=2> <asp:TextBox ID="txt_chkNum" autocomplete="off" height="……
这个验证码生成类和我以前写的太像了!
  • 打赏
  • 举报
回复
让1楼抢了先,但是有个重要地方 reloadcode方法里改变图片url要加时间的哦,要不点击验证码没变化
我就是大神 2012-12-26
  • 打赏
  • 举报
回复
1楼说得好
lw402365015 2012-12-26
  • 打赏
  • 举报
回复
你最后调用CreateValidateGraphic 这个方法撒!这里就输出了一个图片都蛮!
  • 打赏
  • 举报
回复
前台:
 <TR height=30>
                <TD>验证码:</TD>
                <TD vAlign=center colSpan=2>
                 <asp:TextBox ID="txt_chkNum"  autocomplete="off"   height="23px"  Width="100px"  runat="server" ></asp:TextBox>
                    <a href="javascript:reloadcode();" title="更换一张验证码图片"><IMG src="checkNum.aspx?<%= checkNum %>" id="safecode" alt="看不清,请换一张" border=0 align="middle"></a> <a href="javascript:reloadcode();" title="更换一张">看不清</a>  </TD>
              </TR>
后台
 if (this.txt_chkNum.Text != Session["CheckCode"].ToString())
            {
                CommonUse.alertMsg(this.Page, "验证码错误。");
                this.txt_chkNum.Text = "";
                this.txt_pwd.Focus();
                return;
            }
验证码生成页面 CheckNum.aspx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

public partial class CheckNum : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // 在此处放置用户代码以初始化页面
        string checkNum = CreateRandomCode();
        Session["CheckCode"] = checkNum;
        CreateImage(checkNum);
    }

    //产生随即验证码

    private string CreateRandomCode()
    {

        //做个随机数库
        string allChar = "0,1,2,3,4,5,6,7,8,9";
        //将库里的字符放到数组里去
        string[] allCharArray = allChar.Split(',');
        //定义RandomCode变量,为了存放生成的随机数。
        string RandomCode = "";
        int temp = -1;
        //实例Random函数
        Random rand = new Random();
        //for循环,这里是四次循环,为了是产生四个随机数,如果要产生多个,自己定义循环次数
        for (int i = 0; i < 4; i++)
        {
            if (temp != -1)
            {
                //在非第一次循环后执行这里,根据DataTime产生一个随机种子,用来计算伪随机数序列起始值的数字
                rand = new Random(i * temp * ((int)System.DateTime.Now.Ticks));
            }
            //返回一个小于指定最大值的非负随机数
            int t = rand.Next(9);
            if (temp == t)
            {
                return CreateRandomCode();
            }
            temp = t;

            //将产生的值放入RandomCode变量中
            RandomCode += allCharArray[t];
        }
        //返回产生的随机字符串
        return RandomCode;
    }


    //这个是将数字产生图片的函数:
    private void CreateImage(string RandomCode)
    {
        int iWidth;
        //根据字符串的长度确定生成图片的宽度
        iWidth = (int)(RandomCode.Length * 11.5);
        //实例一个位图
        System.Drawing.Bitmap image = new Bitmap(iWidth, 20);
        //封装GDI+绘图面(此类无法继承)
        System.Drawing.Graphics g = Graphics.FromImage(image);
        //实例文本格式,包括字体,字号,字形
        Font f = new Font("Arial", 10, System.Drawing.FontStyle.Bold);
        //实例填充图形形状
        System.Drawing.Brush b = new System.Drawing.SolidBrush(Color.Black);
        //清楚整个绘图面并以指定背景色填充
        g.Clear(Color.White);
        //绘制吧
        g.DrawString(RandomCode, f, b, 3, 3);

        //创建一个内存流
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        //将此图像以指定的格式保存到指定的流中
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        //清楚缓存区流中的所有内容输出
        Response.ClearContent();
        //设置输出流的HTTP MIME类型
        Response.ContentType = "image/Jpeg";
        //将一个二进制字符串写入HTTP输出流
        Response.BinaryWrite(ms.ToArray());
        //释放资源
        g.Dispose();
        //释放资源
        image.Dispose();
    }
}

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧