• asp.net验证码的生成(vb)


             为了防止机器人的自动攻击,几乎每个asp.net程序中都要用到验证码,特别是需要用户登陆的地方,找了些资料,模仿网上的源程序做了一个VB版的验证码程序,分享一下.
     
      1.先新建一个类CreateImage.vb,将下面的代码Copy进去;

      2.新建一个页面Image.aspx,在Page_load中添加类CreateImage.vb的引用:
         Dim myimage As New CreateImage
               myimage.DrawImage()

            3. 在需要验证码的页面,添加一个Image控件,其中属性:ImageUrl="Image.aspx"
        页面再添加一个TextBox控件txtCode,用于输入验证码的值.

      4. 在提交按钮(如登陆)的代码中,加上一个"与"的条件,txtCode.Text=Session("CheckCode")

          5.   这个代码有些缺点,希望大家能提出来一起解决,期待......


    Imports System.Drawing
    Public Class CreateImage

        Public Shared Sub DrawImage()
            Dim img As New CreateImage()
            HttpContext.Current.Session("CheckCode") = img.RndNum(4)
            img.CreateImages(HttpContext.Current.Session("CheckCode").ToString())
        End Sub 'DrawImage


        '/ <summary>
        '/ 生成验证图片
        '/ </summary>
        '/ <param name="checkCode">验证字符</param>
        Private Sub CreateImages(ByVal checkCode As String)
            Dim iwidth As Integer = CInt(checkCode.Length * 13)
            Dim image As New System.Drawing.Bitmap(iwidth, 23)
            Dim g As Graphics = Graphics.FromImage(image)
            g.Clear(Color.White)
            '定义颜色
            Dim c As Color() = {Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple}
            '定义字体
            Dim font As String() = {"Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体"}
            Dim rand As New Random()
            '随机输出噪点
            Dim i As Integer
            For i = 0 To 49
                Dim x As Integer = rand.Next(image.Width)
                Dim y As Integer = rand.Next(image.Height)
                g.DrawRectangle(New Pen(Color.LightGray, 0), x, y, 1, 1)
            Next i

            '输出不同字体和颜色的验证码字符
            For i = 0 To checkCode.Length - 1
                Dim cindex As Integer = rand.Next(7)
                Dim findex As Integer = rand.Next(5)

                Dim f = New System.Drawing.Font(font(findex), 10, System.Drawing.FontStyle.Bold)
                Dim b = New System.Drawing.SolidBrush(c(cindex))
                Dim ii As Integer = 4
                If (i + 1) Mod 2 = 0 Then
                    ii = 2
                End If
                g.DrawString(checkCode.Substring(i, 1), f, b, 3 + i * 12, ii)
            Next i
            '画一个边框
            g.DrawRectangle(New Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1)

            '输出到浏览器
            Dim ms As New System.IO.MemoryStream()
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
            HttpContext.Current.Response.ClearContent()
            'Response.ClearContent();
            HttpContext.Current.Response.ContentType = "image/Jpeg"
            HttpContext.Current.Response.BinaryWrite(ms.ToArray())
            g.Dispose()
            image.Dispose()
        End Sub 'CreateImages


        '/ <summary>
        '/ 生成随机的字母
        '/ </summary>
        '/ <param name="VcodeNum">生成字母的个数</param>
        '/ <returns>string</returns>
        Private Function RndNum(ByVal VcodeNum As Integer) As String
            Dim Vchar As String = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k"
            Dim VcArray As String() = Vchar.Split(","c)
            Dim VNum As String = "" '由于字符串很短,就不用StringBuilder了
            Dim temp As Integer = -1 '记录上次随机数值,尽量避免生产几个一样的随机数
            '采用一个简单的算法以保证生成随机数的不同
            Dim rand As New Random()
            Dim i As Integer
            For i = 1 To (VcodeNum + 1) - 1
                If temp <> -1 Then
                    'rand = New Random(i * temp * Convert.ToInt64(Int(DateTime.Now.Ticks)))
                    rand = New Random(i * temp * 1000000)
                    '
                    'ToDo: Error processing original source shown below
                    '-------------------------^--- GenCode(token): unexpected token type
                End If
                Dim t As Integer = rand.Next(VcArray.Length)
                If temp <> -1 And temp = t Then
                    Return RndNum(VcodeNum)
                End If
                temp = t
                VNum += VcArray(t)
            Next i
            Return VNum
        End Function 'RndNum

  • 相关阅读:
    MDK中编译程序后Program Size详解
    win10快速访问的文件夹无法删除的解决方法
    stm32类型cl、vl、xl、ld、md、hd的含义
    史上最全软件测试工程师常见的面试题总结(四)【多测师_王sir】
    基于PO和单例设计模式用python+selenium进行ui自动化框架设计【多测师】
    经典的Python编程题【多测师_王sir】
    Java中的泛型【多测师_王sir】【软件测试】
    Java设计模式之单例模式、工厂模式、PO模式【多测师_王sir】
    Java+Selenium做UI自动化中@FindBy和@CacheLookup用法【多测师_王sir】
    postman中接口的入参为图片的处理方式【多测师_王sir】
  • 原文地址:https://www.cnblogs.com/Weaver/p/727268.html
Copyright © 2020-2023  润新知