ASPNET驗證碼實現原理
通過隨機函數產生驗證碼元素將數值型的驗證碼元素轉換成字符型然後再連成字符串將驗證碼字符串寫入Cookie以供驗證時調用
通過後台動態繪制位圖的方法繪制一個指定大小的位圖然後在空白位圖畫出底紋驗證碼字體和邊框
ASPNET驗證碼實現代碼
()Loginaspx(登錄頁前台)
< %@ Page language=c# Codebehind=Loginaspxcs AutoEventWireup=false Inherits=ValidatorLogin %>
< !DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
< HTML>
< HEAD>
< title>Login< /title>
< meta name=GENERATOR Content=Microsoft Visual Studio NET >
< meta name=CODE_LANGUAGE Content=C#>
< meta name=vs_defaultClientScript content=JavaScript>
< meta name=vs_targetSchema content=>
< /HEAD>
< body MS_POSITIONING=GridLayout>
< form id=Form method=post runat=server>
< asp:button id=Button style=ZINDEX: ; LEFT: px; POSITION: absolute; TOP: px runat=server
Width=px Text=提交>< /asp:button>
< IMG src=CheckCodeaspx>
< asp:label id=lblMessage style=ZINDEX: ; LEFT: px; POSITION: absolute; TOP: px
runat=server>< /asp:label>
< asp:textbox id=txtCheckCode style=ZINDEX: ; LEFT: px; POSITION: absolute; TOP: px
runat=server Width=px>< /asp:textbox>
< /form>
< /body>
< /HTML>
()Loginaspxcs(登錄頁後台)
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
namespace Validator
{
/**//// < summary>
/// Login 的摘要說明
/// < /summary>
public class Login : SystemWebUIPage
{
protected SystemWebUIWebControlsButton Button;
protected SystemWebUIWebControlsLabel lblMessage;
protected SystemWebUIWebControlsTextBox txtCheckCode;
private void Page_Load(object sender SystemEventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
}
Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 Web 窗體設計器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/**//// < summary>
/// 設計器支持所需的方法 不要使用代碼編輯器修改
/// 此方法的內容
/// < /summary>
private void InitializeComponent()
{
thisButtonClick += new SystemEventHandler(thisButton_Click);
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
private void Button_Click(object sender SystemEventArgs e)
{
if(RequestCookies[CheckCode] == null)
{
lblMessageText = 您的浏覽器設置已被禁用 Cookies您必須設置浏覽器允許使用 Cookies 選項後才能使用本系統;
lblMessageVisible = true;
return;
}
if(StringCompare(RequestCookies[CheckCode]Value txtCheckCodeText false) != ) //參數為false時為區分大小寫
{
lblMessageText = 驗證碼錯誤請輸入正確的驗證碼;
lblMessageVisible = true;
return;
}
else
{
lblMessageText = 通過驗證;
lblMessageVisible = true;
return;
}
}
}
}
() CheckCodeaspx(驗證頁前台)
< %@ Page language=c# Codebehind=CheckCodeaspxcs AutoEventWireup=false Inherits=ValidatorCheckCode %>
< !DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
< html>
< head>
< title>CheckCode< /title>
< meta name=GENERATOR Content=Microsoft Visual Studio NET >
< meta name=CODE_LANGUAGE Content=C#>
< meta name=vs_defaultClientScript content=JavaScript>
< meta name=vs_targetSchema content=>
< /head>
< body MS_POSITIONING=GridLayout>
< form id=Form method=post runat=server>
< FONT face=宋體>< /FONT>
< /form>
< /body>
< /html>
()CheckCodeaspxcs(驗證頁後台)
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
namespace Validator
{
/**//// < summary>
/// CheckCode 的摘要說明
/// < /summary>
public class CheckCode : SystemWebUIPage
{
private void Page_Load(object sender SystemEventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
thisCreateCheckCodeImage(GenerateCheckCode());
}
Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 Web 窗體設計器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/**//// < summary>
/// 設計器支持所需的方法 不要使用代碼編輯器修改
/// 此方法的內容
/// < /summary>
private void InitializeComponent()
{
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
private string GenerateCheckCode()
{
int number;
char code;
string checkCode = StringEmpty;
SystemRandom random = new Random();
for(int i=; i< ; i++)
{ //隨機產生一個整數
number = randomNext();
//如果隨機數是偶數 取余選擇從[]
if(number % == )
code = (char)( + (char)(number % ));
else
//如果隨機數是奇數 選擇從[AZ]
code = (char)(A + (char)(number % ));
checkCode += codeToString();
}
ResponseCookiesAdd(new HttpCookie(CheckCode checkCode));
return checkCode;
}
//建立一個隨機圖形
private void CreateCheckCodeImage(string checkCode)
{
if(checkCode == null || checkCodeTrim() == StringEmpty)
return;
//建立一個位圖文件 確立長寬
SystemDrawingBitmap image = new SystemDrawingBitmap((int)MathCeiling((checkCodeLength * )) );
Graphics g = GraphicsFromImage(image);
try
{
//生成隨機生成器
Random random = new Random();
//清空圖片背景色
gClear(ColorWhite);
//畫圖片的背景噪音點
for(int i=; i< ; i++)
{
int x = randomNext(imageWidth);
int y = randomNext(imageHeight);
imageSetPixel(x y ColorFromArgb(randomNext()));
}
//把產生的隨機數以字體的形式寫入畫面
Font font = new SystemDrawingFont(Arial (SystemDrawingFontStyleBold | SystemDrawingFontStyleItalic));
SystemDrawingDrawingDLinearGradientBrush brush = new SystemDrawingDrawingDLinearGradientBrush(new Rectangle( imageWidth imageHeight) ColorBlue ColorDarkRed f true);
gDrawString(checkCode font brush );
//畫圖片的邊框線
gDrawRectangle(new Pen(ColorSilver) imageWidth imageHeight );
SystemIOMemoryStream ms = new SystemIOMemoryStream();
imageSave(ms SystemDrawingImagingImageFormatGif);
ResponseClearContent();
ResponseContentType = image/Gif;
ResponseBinaryWrite(msToArray());
}
finally
{
gDispose();
imageDispose();
}
}
}
}
ASPNET驗證碼主要函數分析
通過隨機函數(Random)先產生驗證碼組成元素(這裡為五位) 並將其轉換為字符串
(屬性為只讀)完成後寫入Cookie中去以供驗證時調用
將驗證碼字符串寫入圖形
()建立一個位圖文件確定長和寬
SystemDrawingBitmap image = new SystemDrawingBitmap((int)MathCeiling((checkCodeLength * )) );
(a)SystemDrawing [C#] Bitmap(int widthint height)
(b)double MathCeiling (double a)返回大於或等於指定數字的最小整數
()畫圖片的背景噪音點(個)
for(int i=; i< ; i++) {
int x = randomNext(imageWidth);
int y = randomNext(imageHeight);
imageSetPixel(x y ColorFromArgb(randomNext()));
}
(a) public virtual int Next(int maxValue);返回一個小於所指定最大值的非負隨機數 參數maxValue要生成的隨機數的上限maxValue 必須大於或等於零
(b) imageSetPixel(int xint yColor color) 參數 x要設置的像素的 x 坐標y要設置的像素的 y 坐標colorColor 結構它表示要分配給指定像素的顏色
(c) ColorFromArgb(int argb) 參數argb指定 位 ARGB 值的值
()把產生的隨機數以字體的形式寫入位圖GraphicsDrawString(string sFont fontBrush brushfloat xfloat y)
參數s要繪制的字符串fontFont 對象它定義字符串的文本格式
brushBrush 對象它確定所繪制文本的顏色和紋理
x所繪制文本的左上角的 x 坐標
y所繪制文本的左上角的 y 坐標(在指定位置並且用指定的 Brush 和 Font 對象繪制指定的文本字符串)
() 畫圖片的邊框線: public void DrawRectangle(Pen pen int x int y int width int height);繪制由坐標對寬度和高度指定的矩形
參數penPen 對象它確定矩形的顏色寬度和樣式
x要繪制的矩形的左上角的 x 坐標
y要繪制的矩形的左上角的 y 坐標
width要繪制的矩形的寬度height要繪制的矩形的高度
() 將圖片以二進制流的方式輸出加上格式並可顯示出來
以上就是
中驗證碼產生的原理及其應用
From:http://tw.wingwit.com/Article/program/ASP/201311/21722.html