• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    asp.net 验证码的简单制作(vb.net+C#)
    网站上验证码效果一般制作方法是:
    1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中。
    2)页面中使用异步方式(js等)进行刷新当前页面的验证码。
    【示例】
    1)创建一个“一般应用处理程序ashx”,代码如下:
    [C#]
    复制代码 代码如下:

    public class ValidationCode : IHttpHandler
    {
    //随机发生器
    static Random r = new Random(Guid.NewGuid().GetHashCode());
    //排除黑色、透明色颜色,因为底色黑色
    static PropertyInfo[] colors = (typeof(Brushes).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black" p.Name != "Transparent").Select(p => p).ToArray();
    //排除黑色颜色,因为底色黑色
    static PropertyInfo[] linecolors = (typeof(Pens).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black").Select(p => p).ToArray();
    //获取静态类Brushes实例对象
    static object colorobj = typeof(Brushes).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null);
    //获取静态类Pens实例对象
    static object penobj = typeof(Pens).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null);
    //每个随机字符的宽度
    const float PERNUMBERWIDTH = 40.0f;
    //每个字符的高度
    const float PERNUMBERHEIGHT = 50.0f;
    public void ProcessRequest(HttpContext context)
    {
    //获取要产生多少随机数(默认产生5个)
    int reqNum = 5;
    if (context.Request.QueryString["reqNum"] != null)
    {
    int.TryParse(context.Request.QueryString["reqNum"], out reqNum);
    }
    //产生多少大的背景图
    Bitmap bt = new Bitmap((int)(PERNUMBERWIDTH*reqNum), (int)PERNUMBERHEIGHT);
    Graphics g = Graphics.FromImage(bt);
    //产生4个随机数(number可以被保存到Session中)
    string numbers = "";
    //绘制数字
    for (int i = 1; i = reqNum; i++)
    {
    numbers += r.Next(0, 9).ToString();
    var color = (PropertyInfo)colors.GetValue(r.Next(0, colors.Length));
    context.Response.Write(color.Name + "br/>");
    Brush randomcolor = (Brush)color.GetValue(colorobj, null);
    g.DrawString(numbers[i-1].ToString(), new Font("黑体", PERNUMBERWIDTH),randomcolor, new PointF((i-1)*PERNUMBERWIDTH, 0f));
    }
    //绘制随机线条
    int linenum = r.Next(10, 21);
    for (int i = 1; i = linenum; i++)
    {
    var linecolor = (PropertyInfo)linecolors.GetValue(r.Next(0, colors.Length));
    Pen randomcolor = (Pen)linecolor.GetValue(penobj, null);
    g.DrawLine(randomcolor, new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT)), new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT)));
    }
    g.Dispose();
    context.Response.Clear();
    context.Response.ContentType = "image/jpeg";
    bt.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    bt.Dispose();
    context.Response.End();
    }
    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }

    [VB.NET]
    复制代码 代码如下:

    Public Class ValidationCode
    Implements IHttpHandler
    '随机发生器
    Shared r As New Random(Guid.NewGuid().GetHashCode())
    '排除黑色、透明色颜色,因为底色黑色
    Shared colors As PropertyInfo() = (GetType(Brushes).GetProperties(System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.GetProperty Or System.Reflection.BindingFlags.[Static])).Where(Function(p) p.Name > "Black" AndAlso p.Name > "Transparent").[Select](Function(p) p).ToArray()
    '排除黑色颜色,因为底色黑色
    Shared linecolors As PropertyInfo() = (GetType(Pens).GetProperties(System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.GetProperty Or System.Reflection.BindingFlags.[Static])).Where(Function(p) p.Name > "Black").[Select](Function(p) p).ToArray()
    '获取静态类Brushes实例对象
    Shared colorobj As Object = GetType(Brushes).GetConstructor(BindingFlags.NonPublic, Nothing, Type.EmptyTypes, Nothing)
    '获取静态类Pens实例对象
    Shared penobj As Object = GetType(Pens).GetConstructor(BindingFlags.NonPublic, Nothing, Type.EmptyTypes, Nothing)
    '每个随机字符的宽度
    Const PERNUMBERWIDTH As Single = 40F
    '每个字符的高度
    Const PERNUMBERHEIGHT As Single = 50F
    Public Sub ProcessRequest(context As HttpContext)
    '获取要产生多少随机数(默认产生5个)
    Dim reqNum As Integer = 5
    If context.Request.QueryString("reqNum") IsNot Nothing Then
    Integer.TryParse(context.Request.QueryString("reqNum"), reqNum)
    End If
    '产生多少大的背景图
    Dim bt As New Bitmap(CInt(Math.Truncate(PERNUMBERWIDTH * reqNum)), CInt(Math.Truncate(PERNUMBERHEIGHT)))
    Dim g As Graphics = Graphics.FromImage(bt)
    '产生4个随机数(number可以被保存到Session中)
    Dim numbers As String = ""
    '绘制数字
    For i As Integer = 1 To reqNum
    numbers += r.[Next](0, 9).ToString()
    Dim color = DirectCast(colors.GetValue(r.[Next](0, colors.Length)), PropertyInfo)
    context.Response.Write(Convert.ToString(color.Name) "br/>")
    Dim randomcolor As Brush = DirectCast(color.GetValue(colorobj, Nothing), Brush)
    g.DrawString(numbers(i - 1).ToString(), New Font("黑体", PERNUMBERWIDTH), randomcolor, New PointF((i - 1) * PERNUMBERWIDTH, 0F))
    Next
    '绘制随机线条
    Dim linenum As Integer = r.[Next](10, 21)
    For i As Integer = 1 To linenum
    Dim linecolor = DirectCast(linecolors.GetValue(r.[Next](0, colors.Length)), PropertyInfo)
    Dim randomcolor As Pen = DirectCast(linecolor.GetValue(penobj, Nothing), Pen)
    g.DrawLine(randomcolor, New PointF(CSng(r.NextDouble() * PERNUMBERWIDTH * reqNum), CSng(r.NextDouble() * PERNUMBERHEIGHT)), New PointF(CSng(r.NextDouble() * PERNUMBERWIDTH * reqNum), CSng(r.NextDouble() * PERNUMBERHEIGHT)))
    Next
    g.Dispose()
    context.Response.Clear()
    context.Response.ContentType = "image/jpeg"
    bt.Save(context.Response.OutputStream, ImageFormat.Jpeg)
    bt.Dispose()
    context.Response.[End]()
    End Sub
    Public ReadOnly Property IsReusable() As Boolean
    Get
    Return False
    End Get
    End Property
    End Class

    注意:
    1)一些诸如Brushes等特定因为是公用的,需要通过反射获取全部的颜色属性列表,因此使用了静态变量,这样不必每次都初始化,节省内存和时间。
    2)Brushes避免黑色和透明色(本示例背景色是黑色),Pens只需避免黑色即可。有关Brushes颜色,可以查阅:http://msdn.microsoft.com/zh-cn/library/system.windows.media.brush(v=vs.95).aspx
    3)Bitmap类是用于绘制使用的,一般是空白的黑色背景。一般配合Image类+Graphics画布使用,进行绘制。
    4)BitMap的Save方法有若干个重载版本,其中之一可以指定输出流以及设置图片格式。本示例就是使用了这个函数。
    【应用】

    Html中代码(验证码部分,局部):
    复制代码 代码如下:

    h1>
    验证码
    /h1>
    script>
    function ChangeSD() {
    document.getElementById("imgSD").src = "";
    document.getElementById("imgSD").src = "/ValidationCode.ashx?reqNum=10";
    };
    /script>
    img src="/ValidationCode.ashx?reqNum=10" id="imgSD" />
    input type="button" value="Change Validation Key" onclick="ChangeSD()" />

    注意,之所以使用js设置img的src两次,是因为重复的路径不会引发请求。
    您可能感兴趣的文章:
    • asp.net 验证码生成和刷新及验证
    • asp.net(C#) 生成随机验证码的代码
    • asp.net 简单验证码验证实现代码
    • ASP.NET MVC验证码功能实现代码
    • ASP.NET中的无刷新验证码的开发(完整代码)
    • asp.net 图片验证码的HtmlHelper
    • asp.net生成验证码(纯数字)
    • asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
    • asp.net下生成英文字符数字验证码的代码
    • asp.net生成字母和数字混合图形验证码
    • Asp.net开发之webform图片水印和图片验证码的实现方法
    • ASP.NET实现的生成验证码功能示例【附demo源码】
    上一篇:asp.net程序优化 尽量减少数据库连接操作
    下一篇:asp.net中将某字符串切割成阵列并排序列出
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    asp.net 验证码的简单制作(vb.net+C#) asp.net,验证,码,的,简单,