在Web系統中很多時候需要用到校驗碼,例如我們經常遇到不少電子郵件、論壇的注冊過程需要我們輸入校驗碼,這是為了提高安全性。今天我們就來講講如何生成校驗碼。
使用ASP.NET來生成校驗碼圖像很方便,網上也有不少教程與文章有介紹,但是都講的太簡單了,不夠實用。我來介紹一點自己的思路,算是拋磚引玉吧。
首先我們來看看,生成校驗碼的一種常見方式:
1.生成校驗碼的字符串
2.將該字符串輸出為圖像
具體步驟
下面我們就開始簡單的例子來介紹這個過程,首先打開VS.NET,新建一個Web Site,添加一個新的 Web Form,取名為 VCode.aspx,在其代碼文件(VCode.aspx.vb)中添加一個函數generateVCode,此函數用於生成校驗碼的字符串,具體代碼如下:
''' <summary>
''' 產生隨機數(包含字母與數字)用於校驗碼
''' </summary>
''' <param name="CodeLength"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function generateVCode(ByVal CodeLength As Integer) As String
Dim VCode As String = String.Empty
Dim randObj As New Random()
Dim c As Integer = 63
For i As Byte = 1 To CodeLength
c = randObj.Next(35)
If c >= 10 Then
c += 7
End If
c += 48
VCode += Chr(c)
Next
Return VCode
End Function
上面的的函數使用隨機數來代表需要產生的校驗碼,包含數字與大寫的字母。
接著我們需要將上面生成的校驗碼字符串作為圖像輸出。利用ASP.NET的強大圖像處理功能可以很方便的實現這一點。但是考慮到直接將校驗碼生成圖像輸出,安全性太差,我們需要做一些增強。這裡我介紹一種簡單的方法,就是為校驗碼圖像增加背景,可以使用現有的一些圖像作為背景,也可以使用ASP.NET直接畫出背景。為了講解的方便,這裡我們介紹使用ASP.NET直接來畫出背景。
首先,圖像上輸出文字之前,可以隨即選擇一種畫筆的筆觸(HatchBrush),具體的代碼如下:
''' <summary>
''' 產生隨機的筆觸樣式(用於圖像的背景)
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Private Function generateHatchStyle() As HatchStyle
Dim slist As New ArrayList
For Each style As HatchStyle In System.Enum.GetValues(GetType(HatchStyle))
slist.Add(style)
Next
Dim randObj As New Random()
Dim index As Integer = randObj.Next(slist.Count - 1)
Return CType(slist(index), HatchStyle)
End Function
現在校驗碼字符串已經產生,用於圖像背景的畫筆也有了,我們就介紹具體的圖像輸出,使用函數GenerateVCodeImage來輸出圖像,
''' <summary>
''' 產生隨機數校驗碼圖像
''' </summary>
''' <remarks></remarks>
Private Function GenerateVCodeImage()
Dim oBitmap As Bitmap = New Bitmap(90, 35)
Dim oGraphic As Graphics = Graphics.FromImage(oBitmap)
Dim foreColor As System.Drawing.Color
Dim backColor As System.Drawing.Color
Dim sText As String = generateVCode(5) '獲取校驗碼字符串
Dim sFont As String = "Comic Sans MS" '設置自己喜歡的字體
'前景、背景的顏色
foreColor = Color.FromArgb(220, 220, 220)
backColor = Color.FromArgb(190, 190, 190)
'設置用於背景的畫筆
Dim oBrush As New HatchBrush(CType(generateHatchStyle(), HatchStyle), foreColor, backColor)
'用於輸出校驗碼的畫筆
Dim oBrushWrite As New SolidBrush(Color.Gray)
'生成的圖像矩形大小
oGraphic.FillRectangle(oBrush, 0, 0, 100, 50)
oGraphic.TextRenderingHint = TextRenderingHint.AntiAlias
Dim oFont As New Font(sFont, 14)
Dim oPoint As New PointF(5.0F, 4.0F)
oGraphic.DrawString(sText, oFont, oBrushWrite, oPoint)
Response.ContentType = "image/jpeg"
oBitmap.Save(Response.OutputStream, ImageFormat.Jpeg)
oBitmap.Dispose()
Return sText
End Function