ASPNET验证码实现原理
通过随机函数产生验证码元素将数值型的验证码元素转换成字符型然后再连成字符串将验证码字符串写入Cookie以供验证时调用
通过后台动态绘制位图的方法绘制一个指定大小的位图然后在空白位图画出底纹验证码字体和边框
ASPNET验证码实现代码
()Loginaspx(登录页前台)
<%@Pagelanguage=c#Codebehind=LoginaspxcsAutoEventWireup=falseInherits=ValidatorLogin%>
<!DOCTYPEHTMLPUBLIC//WC//DTDHTMLTransitional//EN>
<HTML>
<HEAD>
<title>Login</title>
<metaname=GENERATORContent=MicrosoftVisualStudioNET>
<metaname=CODE_LANGUAGEContent=C#>
<metaname=vs_defaultClientScriptcontent=JavaScript>
<metaname=vs_targetSchemacontent=>
</HEAD>
<bodyMS_POSITIONING=GridLayout>
<formid=Formmethod=postrunat=server>
<asp:buttonid=Buttonstyle=ZINDEX:;LEFT:px;POSITION:absolute;TOP:pxrunat=server
Width=pxText=提交></asp:button>
<IMGsrc=CheckCodeaspx>
<asp:labelid=lblMessagestyle=ZINDEX:;LEFT:px;POSITION:absolute;TOP:px
runat=server></asp:label>
<asp:textboxid=txtCheckCodestyle=ZINDEX:;LEFT:px;POSITION:absolute;TOP:px
runat=serverWidth=px></asp:textbox>
</form>
</body>
</HTML>
()Loginaspxcs(登录页后台)
usingSystem;
usingSystemCollections;
usingSystemComponentModel;
usingSystemData;
usingSystemDrawing;
usingSystemWeb;
usingSystemWebSessionState;
usingSystemWebUI;
usingSystemWebUIWebControls;
usingSystemWebUIHtmlControls;
namespaceValidator
{
/**////<summary>
///Login的摘要说明
///</summary>
publicclassLogin:SystemWebUIPage
{
protectedSystemWebUIWebControlsButtonButton;
protectedSystemWebUIWebControlsLabellblMessage;
protectedSystemWebUIWebControlsTextBoxtxtCheckCode;
privatevoidPage_Load(objectsenderSystemEventArgse)
{
//在此处放置用户代码以初始化页面
}
Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是Web窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/**////<summary>
///设计器支持所需的方法不要使用代码编辑器修改
///此方法的内容
///</summary>
privatevoidInitializeComponent()
{
thisButtonClick+=newSystemEventHandler(thisButton_Click);
thisLoad+=newSystemEventHandler(thisPage_Load);
}
#endregion
privatevoidButton_Click(objectsenderSystemEventArgse)
{
if(RequestCookies[CheckCode]==null)
{
lblMessageText=您的浏览器设置已被禁用Cookies您必须设置浏览器允许使用Cookies选项后才能使用本系统;
lblMessageVisible=true;
return;
}
if(StringCompare(RequestCookies[CheckCode]ValuetxtCheckCodeTextfalse)!=)//参数为false时为区分大小写
{
lblMessageText=验证码错误请输入正确的验证码;
lblMessageVisible=true;
return;
}
else
{
lblMessageText=通过验证;
lblMessageVisible=true;
return;
}
}
}
}
() CheckCodeaspx(验证页前台)
<%@Pagelanguage=c#Codebehind=CheckCodeaspxcsAutoEventWireup=falseInherits=ValidatorCheckCode%>
<!DOCTYPEHTMLPUBLIC//WC//DTDHTMLTransitional//EN>
<html>
<head>
<title>CheckCode</title>
<metaname=GENERATORContent=MicrosoftVisualStudioNET>
<metaname=CODE_LANGUAGEContent=C#>
<metaname=vs_defaultClientScriptcontent=JavaScript>
<metaname=vs_targetSchemacontent=>
</head>
<bodyMS_POSITIONING=GridLayout>
<formid=Formmethod=postrunat=server>
<FONTface=宋体></FONT>
</form>
</body>
</html>
()CheckCodeaspxcs(验证页后台)
usingSystem;
usingSystemCollections;
usingSystemComponentModel;
usingSystemData;
usingSystemDrawing;
usingSystemWeb;
usingSystemWebSessionState;
usingSystemWebUI;
usingSystemWebUIWebControls;
usingSystemWebUIHtmlControls;
namespaceValidator
{
/**////<summary>
///CheckCode的摘要说明
///</summary>
publicclassCheckCode:SystemWebUIPage
{
privatevoidPage_Load(objectsenderSystemEventArgse)
{
//在此处放置用户代码以初始化页面
thisCreateCheckCodeImage(GenerateCheckCode());
}
Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是Web窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/**////<summary>
///设计器支持所需的方法不要使用代码编辑器修改
///此方法的内容
///</summary>
privatevoidInitializeComponent()
{
thisLoad+=newSystemEventHandler(thisPage_Load);
}
#endregion
privatestringGenerateCheckCode()
{
intnumber;
charcode;
stringcheckCode=StringEmpty;
SystemRandomrandom=newRandom();
for(inti=;i<;i++)
{//随机产生一个整数
number=randomNext();
//如果随机数是偶数取余选择从[]
if(number%==)
code=(char)(+(char)(number%));
else
//如果随机数是奇数选择从[AZ]
code=(char)(A+(char)(number%));
checkCode+=codeToString();
}
ResponseCookiesAdd(newHttpCookie(CheckCodecheckCode));
returncheckCode;
}
//建立一个随机图形
privatevoidCreateCheckCodeImage(stringcheckCode)
{
if(checkCode==null||checkCodeTrim()==StringEmpty)
return;
//建立一个位图文件确立长宽
SystemDrawingBitmapimage=newSystemDrawingBitmap((int)MathCeiling((checkCodeLength*)));
Graphicsg=GraphicsFromImage(image);
try
{
//生成随机生成器
Randomrandom=newRandom();
//清空图片背景色
gClear(ColorWhite);
//画图片的背景噪音点
for(inti=;i<;i++)
{
intx=randomNext(imageWidth);
inty=randomNext(imageHeight);
imageSetPixel(xyColorFromArgb(randomNext()));
}
//把产生的随机数以字体的形式写入画面
Fontfont=newSystemDrawingFont(Arial(SystemDrawingFontStyleBold|SystemDrawingFontStyleItalic));
SystemDrawingDrawingDLinearGradientBrushbrush=newSystemDrawingDrawingDLinearGradientBrush(newRectangle(imageWidthimageHeight)ColorBlueColorDarkRedftrue);
gDrawString(checkCodefontbrush);
//画图片的边框线
gDrawRectangle(newPen(ColorSilver)imageWidthimageHeight);
SystemIOMemoryStreamms=newSystemIOMemoryStream();
imageSave(msSystemDrawingImagingImageFormatGif);
ResponseClearContent();
ResponseContentType=image/Gif;
ResponseBinaryWrite(msToArray());
}
finally
{
gDispose();
imageDispose();
}
}
}
}
ASPNET验证码主要函数分析
通过随机函数(Random)先产生验证码组成元素(这里为五位) 并将其转换为字符串
(属性为只读)完成后写入Cookie中去以供验证时调用
将验证码字符串写入图形
()建立一个位图文件确定长和宽
SystemDrawingBitmapimage=newSystemDrawingBitmap((int)MathCeiling((checkCodeLength*)));
(a)SystemDrawing [C#] Bitmap(int widthint height)
(b)double MathCeiling (double a)返回大于或等于指定数字的最小整数
()画图片的背景噪音点(个)
for(inti=;i<;i++){
intx=randomNext(imageWidth);
inty=randomNext(imageHeight);
imageSetPixel(xyColorFromArgb(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要绘制的矩形的高度
() 将图片以二进制流的方式输出加上格式并可显示出来
以上就是
中验证码产生的原理及其应用