top
Loading...
ASP.NET程序中實現校驗碼圖像生成
在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

上面介紹的都是幾個實現具體功能的函數,我們還需要在VCode.aspx的Page Load事件里面添加調用這些函數的代碼,具體如下:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim code As String = GenerateVCodeImage()
Session("VCode") = code
End Sub

現在來看看效果,刷新幾次比較一下,注意背景的不同:


我們已經能夠生成校驗碼的圖像了,那么如何使用呢?下面介紹一個簡單的例子說明如何使用這個VCode.aspx。

在VS.NET中,轉到Default.aspx頁面添加一個名為:TextBox1的TextBox,在其右邊添加一個Button,ID設置為btnCheck,還要再添加一個用于顯示提示信息的Label,把它的ID設置為lblMessage。最后是我們的重點,添加一個Image控件,設置ImageUrl='VCode.aspx'。以上幾個步驟設置結束后的參考HTML如下:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="btnCheck" runat="server" Text="Check It" /> 
<asp:Label ID="lblMessage" runat="server"></asp:Label><br />
<br />
<asp:Image ID="Image1" runat="server" Height="32px" Width="104px" ImageUrl='VCode.aspx' /> <br />
<br />

當然,我們還需要實現檢查用戶輸入校驗碼是否正確,并給出提示。具體代碼如下:

Protected Sub btnCheck_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCheck.Click
Dim code As String = Session("VCODE")
If TextBox1.Text.Trim.ToUpper = code Then
lblMessage.Text = "校驗成功!"
lblMessage.ForeColor = Color.Blue
Else
lblMessage.Text = "您輸入的注冊碼錯誤!"
lblMessage.ForeColor = Color.Red
End If
TextBox1.Text = ""
End Sub

具體的效果如下:


總 結

上述的方法考慮到講述的方便,省略了一些細節。當然我們可以根據具體的應用對上述實現的方法進行一些改進,例如上面介紹的字符串生成函數會生成字符O與數字0,會對用戶造成混淆。對于這個問題,可以在其循環過程中添加如下代碼解決(不生成數字0, 當然也可以選擇兩個都不生成):

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
'是否顯示 數字:0, 因為數字0 與字母O 容易混淆
'While (c = 63)
' c = randObj.Next(35)
'End While
c = randObj.Next(35)
If c >= 10 Then
c += 7
End If
c += 48
VCode += Chr(c)
Next

Return VCode
End Function

我們還可以在生成圖像的過程中,使用更加復雜的方法來增強安全性,常用的方法有:

1.在上述圖像生成結束后,在圖像上添加隨機的雜點,或者是隨機的線條

2.使用彩色的字體或者背景;

3.使用預先準備的干擾性更強的背景;

4.還可以移動或者旋轉每個字符的位置與角度;

當然我們也可以使用漢字來做校驗碼,但是用戶恐怕很難接受吧,哈哈遇到校驗碼里面的字居然不認識的時候,說不定很抓狂~~。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗