为了防止机器人的自动攻击,几乎每个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.DrawingPublic 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
转载于:https://www.cnblogs.com/Weaver/archive/2007/04/25/727268.html