Imports
System
Imports
System.Web
Imports
System.Drawing
Imports
System.IO
Imports
System.Web.UI
Public
Class
login_validatecode :
Implements
IHttpHandler
#Region
"验证码的长度(默认6个)"
Private
m_codeLenght
As
Integer
=
6
Public
Property
CodeLenght()
As
Integer
Get
Return
m_codeLenght
End
Get
Set
(
ByVal
value
As
Integer
)
m_codeLenght
=
value
End
Set
End Property
#End Region
#Region
"验证码的字体大小(默认13相素)"
Private
m_fontSize
As
Integer
=
13
Public
Property
FontSize()
As
Integer
Get
Return
m_fontSize
End
Get
Set
(
ByVal
value
As
Integer
)
m_fontSize
=
value
End
Set
End Property
#End Region
#Region
"验证码的字体样式(默认Roman)"
Private
m_fontFamily
As
String
=
"
Roman
"
Public
Property
FontFamily()
As
String
Get
Return
m_fontFamily
End
Get
Set
(
ByVal
value
As
String
)
m_fontFamily
=
value
End
Set
End Property
#End Region
#Region
"是否输出燥点"
Private
m_point
As
Boolean
=
True
Public
Property
Point()
As
Boolean
Get
Return
m_point
End
Get
Set
(
ByVal
value
As
Boolean
)
m_point
=
value
End
Set
End Property
#End Region
#Region
"输出燥点的颜色(默认海洋蓝)"
Private
m_pointColor
As
Color
=
Color.LightSeaGreen
Public
Property
PointColor()
As
Color
Get
Return
m_pointColor
End
Get
Set
(
ByVal
value
As
Color)
m_pointColor
=
value
End
Set
End Property
#End Region
#Region
"图片背景噪音线数量(默认5条)"
Private
m_lineNumber
As
Integer
=
5
Public
Property
LineNumber()
As
Integer
Get
Return
m_lineNumber
End
Get
Set
(
ByVal
value
As
Integer
)
m_lineNumber
=
value
End
Set
End Property
#End Region
#Region
"图片背景噪音线颜色(默认灰色)"
Private
m_lineColor
As
Color
=
Color.LightGray
Public
Property
LineColor()
As
Color
Get
Return
m_lineColor
End
Get
Set
(
ByVal
value
As
Color)
m_lineColor
=
value
End
Set
End Property
#End Region
#Region
"图片的背景颜色(默认白色)"
Private
m_backgroundColor
As
Color
=
Color.White
Public
Property
BackgroundColor()
As
Color
Get
Return
m_backgroundColor
End
Get
Set
(
ByVal
value
As
Color)
m_backgroundColor
=
value
End
Set
End Property
#End Region
#Region
"图片边框颜色(默认灰色)"
Private
m_rectangleColor
As
Color
=
Color.LightGray
Public
Property
RectangleColor()
As
Color
Get
Return
m_rectangleColor
End
Get
Set
(
ByVal
value
As
Color)
m_rectangleColor
=
value
End
Set
End Property
#End Region
#Region
"随即颜色数组"
Private
m_colors
As
Color()
=
{Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, _
Color.DarkCyan, Color.Purple}
Public
Property
Colors()
As
Color()
Get
Return
m_colors
End
Get
Set
(
ByVal
value
As
Color())
m_colors
=
value
End
Set
End Property
#End Region
#Region
"随即字符串"
Private
m_randomCode
As
String
=
"
2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z
"
Public
Property
RandomCode()
As
String
Get
Return
m_randomCode
End
Get
Set
(
ByVal
value
As
String
)
m_randomCode
=
value
End
Set
End Property
#End Region
#Region
"生成验证码图片"
Public
Function
CreateImage(
ByVal
code
As
String
)
As
Bitmap
'
设置字体大小
Dim
FSize
As
Integer
=
Me
.FontSize
Dim
FWidth
As
Integer
=
FSize
'
FSize + 2
'
设置图片大小
Dim
ImgWidth
As
Integer
=
CInt
((code.Length
*
FWidth))
+
code.Length
*
2
'
CInt((code.Length * FWidth)) + 4
Dim
ImaHeight
As
Integer
=
FSize
+
6
‘ FSize
*
2
'
创建图片和画笔
Dim
iamge
As
New
Bitmap(ImgWidth, ImaHeight)
Dim
gh
As
Graphics
=
Graphics.FromImage(iamge)
gh.Clear(m_backgroundColor)
'
绘制图片的背景噪音线
Dim
rand
As
New
Random()
For
i
As
Integer
=
1
To
m_lineNumber
Dim
x1
As
Integer
=
rand.Next(ImgWidth)
Dim
x2
As
Integer
=
rand.Next(ImgWidth)
Dim
y1
As
Integer
=
rand.Next(ImaHeight)
Dim
y2
As
Integer
=
rand.Next(ImaHeight)
gh.DrawLine(
New
Pen(m_lineColor), x1, y1, x2, y2)
Next
'
绘制图片边框线
gh.DrawRectangle(
New
Pen(m_rectangleColor,
1
),
0
,
0
, ImgWidth
-
1
, (ImaHeight
-
1
))
'
绘制图片的前景噪音点
If
m_point
Then
For
i
As
Integer
=
0
To
m_codeLenght
*
2
-
1
Dim
x
As
Integer
=
rand.Next(ImgWidth)
Dim
y
As
Integer
=
rand.Next(ImaHeight)
iamge.SetPixel(x, y, Color.FromArgb(rand.Next()))
Next
'
Me.MakePoint(gh, ImgWidth, ImaHeight)
End
If
'
绘制字符串随即颜色
MakeFontColor(gh, code, ImaHeight, FSize)
Return
iamge
End Function
#End Region
#Region
"产生随即字符串"
'''
<summary>
'''
返回产成的随即字符串
'''
</summary>
'''
<param name="codeLenght">
字符串的长度
</param>
'''
<returns>
返回产成的随即字符串
</returns>
Public
Function
MakeCode(
ByVal
codeLenght
As
Integer
)
As
String
Dim
splitStr
As
String
()
=
m_randomCode.Split(
"
,
"
)
Dim
newCode
As
String
=
Nothing
Dim
rand
As
New
Random(
CType
(DateTime.Now.Ticks
Mod
System.Int32.MaxValue,
Integer
))
For
i
As
Integer
=
0
To
codeLenght
-
1
newCode
&=
splitStr(rand.Next(
0
, splitStr.Length
-
1
))
Next
Return
newCode
End Function
#End Region
#Region
"产成字符串的随即颜色"
Public
Sub
MakeFontColor(
ByVal
g
As
Graphics,
ByVal
str
As
String
,
ByVal
imgHeight
As
Integer
,
ByVal
fontSize
As
Integer
)
Dim
b
As
Brush
Dim
colorIndex
As
Integer
Dim
rand
As
New
Random()
Dim
left
As
Integer
=
0
, top
As
Integer
=
0
, top1
As
Integer
=
1
, top2
As
Integer
=
1
Dim
n1
As
Integer
=
imgHeight
-
fontSize
-
4
Dim
n2
As
Integer
=
n1
/
4
top1
=
n2
top2
=
n2
*
2
For
i
As
Integer
=
0
To
m_codeLenght
-
1
colorIndex
=
rand.[
Next
](m_colors.Length
-
1
)
b
=
New
System.Drawing.SolidBrush(m_colors(colorIndex))
If
i
Mod
2
=
1
Then
top
=
top2
Else
top
=
top1
End
If
left
=
i
*
(fontSize)
Dim
f
As
New
Font(
Me
.FontFamily,
Me
.FontSize)
g.DrawString(
str
.Substring(i,
1
), f, b,
left
, top)
Next
End Sub
#End Region
#Region
"随即产生燥点"
'''
<summary>
'''
随即产生燥点
'''
</summary>
'''
<param name="g">
画笔
</param>
'''
<param name="imgWidth">
绘制的宽度
</param>
'''
<param name="imgHeight">
绘制的高度
</param>
Public
Sub
MakePoint(
ByVal
g
As
Graphics,
ByVal
imgWidth
As
Integer
,
ByVal
imgHeight
As
Integer
)
Dim
rand
As
New
Random()
Dim
p
As
New
Pen(m_pointColor,
0
)
For
i
As
Integer
=
0
To
m_codeLenght
*
2
-
1
Dim
x
As
Integer
=
rand.Next(imgWidth)
Dim
y
As
Integer
=
rand.Next(imgHeight)
g.DrawRectangle(p, x, y,
1
,
1
)
Next
End Sub
#End Region
#Region
"将绘制的图片输出到页面"
Public
Sub
CreateImageOnPage(
ByVal
code
As
String
,
ByVal
text
As
HttpContext)
Dim
ms
As
New
MemoryStream()
Dim
img
As
Bitmap
=
CreateImage(code)
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
text.Response.ClearContent()
text.Response.ContentType
=
"
image/Jpeg
"
text.Response.BinaryWrite(ms.GetBuffer())
ms.Close()
ms
=
Nothing
img.Dispose()
img
=
Nothing
End Sub
#End Region
Public
Sub
ProcessRequest(
ByVal
context
As
HttpContext)
Implements
IHttpHandler.ProcessRequest
Dim
gvc
As
New
login_validatecode()
gvc.CodeLenght
=
4
gvc.FontSize
=
13
gvc.Point
=
False
Dim
code
As
String
=
gvc.MakeCode(gvc.CodeLenght)
'
获取随即字符串
HttpContext.Current.Response.Cookies.Add(
New
HttpCookie(
"
BBS_LOGIN_VALIDATECODE
"
, code))
gvc.CreateImageOnPage(code, context)
context.Response.End()
End Sub
Public
ReadOnly
Property
IsReusable()
As
Boolean
Implements
IHttpHandler.IsReusable
Get
Return
False
End
Get
End Property
End Class