熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET下實現數字和字符相混合的驗證碼

2013-11-13 10:24:26  來源: .NET編程 

  經常在論壇裡看到有問怎麼實現驗證碼的帖子其實關於驗證碼的文章在CSDNDEVCLUB等網站上都有很多但是很多文章只講訴了如何輸出一個隨機生成數字或字符的圖象當然了這個是驗證碼的核心了但是對很多ASPNET的初學者來說怎麼使用它生成的圖象又成了一個問題(論壇有不少問這個的)這也是我寫本文的一個原因
 
  言歸正傳關於驗證碼的原理我就不多說了大家可以參見其他文章文末附有完整的實例代碼裡面有詳細的注釋你可以跳過解說文字直接使用
 
首先我要簡要說說Session和ViewState的用法因為後面會用到它
把數據存儲在Session中:Session(key)=test
從Session取值:dim testvalue as string=Session(key)
類似的:
把數據存儲在ViewState中:ViewState(key)=test
從ViewState中取值:dim testvalue as string=ViewState(key)
關於ViewState的更詳細的資料你可以參看MSDN的<<ASPNET ViewState 初探>>一文
百聞不如一見有時代碼本身就比任何解說更有表現力所以在此就不對代碼解說太多了本文實現的驗證碼需要用到兩個文件:
gifaspx 該文件用於生成驗證碼
ValidateCodeaspx 該文件用來測試驗證碼(即如何使用)
下面給出gifaspx的完整代碼:
<%@ import namespace=System%>
<%@ import namespace=Systemio%>
<%@ import namespace=SystemDrawing%>
<%@ import namespace=SystemDrawingImaging%>
<script language=vb runat=server>
Sub Page_Load(Sender as objecte as eventargs)
RndNum是一個自定義函數
dim VNum as string=RndNum()
Session(VNum)=VNum
ValidateCode(VNum)
End Sub
生成圖象驗證碼函數
Sub ValidateCode(VNum)
Dim Img as SystemDrawingBitmap
Dim g as Graphics
Dim ms as MemoryStream
dim gheight as integer=Int(Len(VNum)*)
gheight為圖片寬度根據字符長度自動更改圖片寬度
img=new BitMap(Gheight)
g=GraphicsFromImage(img)
gDrawString(VNum(New Font(Arial))(New SolidBrush(colorblue)))在矩形內繪制字串(字串字體畫筆顏色左上x左上y)
ms=New MemoryStream()
imgSave(msImageFormatPng)
ResponseClearContent() 需要輸出圖象信息 要修改HTTP頭
ResponseContentType=image/Png
ResponseBinaryWrite(msToArray())
gDispose()
imgDispose()
ResponseEnd()
End Sub

函數名稱:RndNum
函數參數:VcodeNum設定返回隨機字符串的位數
函數功能:產生數字和字符混合的隨機字符串
Function RndNum(VcodeNum)
dim Vchar as string=ABCDEFGHIJKLMNOPQRSTUWXYZ
dim VcArray() as string=split(Vchar) 將字符串生成數組
dim VNum as string=
dim i as byte
For i= to VcodeNum
Randomize
VNum=VNum & VcArray(Int(*Rnd)) 數組一般從開始讀取所以這裡為*Rnd
Next
Return VNum
End Function
</script>
那麼又應該如何使用該文件生成的圖象驗證碼看這句代碼:
<asp:Image id=Image runat=server ImageUrl=gifaspx />
這就是用來顯示驗證碼的Image控件你可以把它放在任何你喜歡的地方下面的給出詳細的使用代碼你把它保存為ValidateCodeaspx並把它和gifaspx放在同一目錄下在浏覽器中打開ValidateCodeaspx就可以測試它的效果了:
<script language=vb Runat=Server>
Sub Page_Load(Sender as objecte as eventargs)
dim VNum as string=Session(VNum)
SessionAbandon()
ViewState(VNum)=VNum
End Sub
下面的事件代碼是用來測試驗證碼可以根據需要更改
Sub btnSubmit_click(sender as objecte as eventargs)
判斷輸入的驗證碼與所給是否相同
If txtValidateCodetext=Cstr(ViewState(VNum)) then
lblShowtext=<font color=red>提示:驗證通過</font>
Else
lblShowtext=所填寫的驗證碼與所給的不符
End If
End Sub
</script>
<html>
<body>
<form runat=server>
<div align=center>
<table width=>
<!DWLayoutTable>
<tr>
<td width= height=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
</tr>
<tr>
<td height=></td>
<td></td>
<td colspan= valign=top><asp:label ID=lblShow runat=server>

  </asp:label></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td height=> </td>
<td colspan= valign=middle>驗證碼:</td>
<td valign=top><asp:Image id=Image runat=server ImageUrl=gifaspx /></td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td colspan= valign=top>輸入驗證碼:</td>
<td valign=top><asp:textbox ID=txtValidateCode runat=server TextMode=SingleLine /></td>
<td colspan= valign=middle><font color=#FF size=>*注意:區分大小寫</font></td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td> </td>
<td> </td>
<td valign=top><asp:button ID=btnSubmit runat=server Text=比較 onclick=btnSubmit_click /></td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
</div>
</form>
</body>
</html>


From:http://tw.wingwit.com/Article/program/net/201311/13516.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.