前台代码:
< asp:TextBox ID = " tbck " runat = " server " Width = " 107px " SkinID = " worm " ></ asp:TextBox >
< img alt = " 看不清?点击更换 " onclick = " this.src=this.src+'?' " src = " VerifyCode.aspx " />
< asp:Button ID = " Button1 " runat = " server " OnClick = " Button1_Click " Text = " Button " />
后台代码:
if ( this .tbck.Text == Request.Cookies[ " vCode " ].Value)
{
Response.Write( " 相等 " );
}
////// VerifyCode.aspx
后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
public partial class VerifyCode : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
VerifyCode v = new VerifyCode();
v.Length = this .length;
v.FontSize = this .fontSize;
v.Chaos = this .chaos;
v.BackgroundColor = this .backgroundColor;
v.ChaosColor = this .chaosColor;
v.CodeSerial = this .codeSerial;
v.Colors = this .colors;
v.Fonts = this .fonts;
v.Padding = this .padding;
string code = v.CreateVerifyCode(); // 取随机码
v.CreateImageOnPage(code, this .Context); // 输出图片
Response.Cookies.Add( new HttpCookie( " vCode " , code)); // 使用Cookies取验证码的值
}
// 验证码长度(默认6个验证码的长度)
int length = 4 ;
public int Length
{
get { return length; }
set { length = value; }
}
// 验证码字体大小(为了显示扭曲效果,默认20像素,可以自行修改)
int fontSize = 12 ;
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
// 边框补(默认1像素)
int padding = 1 ;
public int Padding
{
get { return padding; }
set { padding = value; }
}
// 是否输出燥点(默认为输出)
bool chaos = true ;
public bool Chaos
{
get { return chaos; }
set { chaos = value; }
}
// 输出燥点的颜色(默认灰色)
Color chaosColor = Color.LightGray;
public Color ChaosColor
{
get { return chaosColor; }
set { chaosColor = value; }
}
// 自定义背景色(默认白色)
Color backgroundColor = Color.White;
public Color BackgroundColor
{
get { return backgroundColor; }
set { backgroundColor = value; }
}
// 自定义随机颜色数组
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
// 自定义字体数组
string [] fonts = { " Arial " , " Georgia " };
public string [] Fonts
{
get { return fonts; }
set { fonts = value; }
}
// 自定义随机码字符串序列(使用逗号分隔)
// string codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
string codeSerial = " 0,1,2,3,4,5,6,7,8,9 " ;
public string CodeSerial
{
get { return codeSerial; }
set { codeSerial = value; }
}
// 生成校验码图片
public Bitmap CreateImageCode( string code)
{
int fSize = FontSize;
int fWidth = fSize + Padding;
int imageWidth = ( int )(code.Length * fWidth) + 4 + Padding * 2 ;
int imageHeight = fSize * 2 + Padding;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(BackgroundColor);
Random rand = new Random();
// 给背景添加随机生成的燥点
if ( this .Chaos)
{
Pen pen = new Pen(ChaosColor, 0 );
int c = Length * 15 ;
for ( int i = 0 ; i < c; i ++ )
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(pen, x, y, 1 , 1 );
}
}
int left = 0 , top = 0 , top1 = 1 , top2 = 1 ;
int n1 = (imageHeight - FontSize - Padding * 2 );
int n2 = n1 / 4 ;
top1 = n2;
top2 = n2 * 2 ;
Font f;
Brush b;
int cindex, findex;
// 随机字体和颜色的验证码字符
for ( int i = 0 ; i < code.Length; i ++ )
{
cindex = rand.Next(Colors.Length - 1 );
findex = rand.Next(Fonts.Length - 1 );
f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
b = new System.Drawing.SolidBrush(Colors[cindex]);
if (i % 2 == 1 )
{
top = top2;
}
else
{
top = top1;
}
left = i * fWidth;
g.DrawString(code.Substring(i, 1 ), f, b, left, top);
}
// 画一个边框 边框颜色为Color.White
g.DrawRectangle( new Pen(Color.White, 0 ), 0 , 0 , image.Width - 1 , image.Height - 1 );
g.Dispose();
return image;
}
// 将创建好的图片输出到页面
public void CreateImageOnPage( string code, HttpContext context)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Bitmap image = this .CreateImageCode(code);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = " image/jpeg " ;
context.Response.BinaryWrite(ms.GetBuffer());
ms.Close();
ms = null ;
image.Dispose();
image = null ;
}
// 生成随机字符码
public string CreateVerifyCode( int codeLen)
{
if (codeLen == 0 )
{
codeLen = Length;
}
string [] arr = CodeSerial.Split( ' , ' );
string code = "" ;
int randValue = - 1 ;
Random rand = new Random( unchecked (( int )DateTime.Now.Ticks));
for ( int i = 0 ; i < codeLen; i ++ )
{
randValue = rand.Next( 0 , arr.Length - 1 );
code += arr[randValue];
}
return code;
}
public string CreateVerifyCode()
{
return CreateVerifyCode( 0 );
}
}
/// <summary>
/// 数学算式的验证码
/// http://www.zu14.cn/2008/11/22/net_math_vc/
/// Author: DeltaCat (三角猫)
/// </summary>
public sealed class MathVerifyCode
{
#region 生成图片
/// <summary>
/// 输出验证码表达式到浏览器
/// </summary>
/// <param name="context"> httpcontext </param>
/// <param name="sessionKey"> 保存运算值的SESSION的KEY </param>
public void OutputImage(System.Web.HttpContext context, string sessionKey)
{
int mathResult = 0 ;
string expression = null ;
Random rnd = new Random();
/// /生成3个10以内的整数,用来运算
int operator1 = rnd.Next( 0 , 10 );
int operator2 = rnd.Next( 0 , 10 );
int operator3 = rnd.Next( 0 , 10 );
/// /随机组合运算顺序,只做 + 和 * 运算
switch (rnd.Next( 0 , 3 ))
{
case 0 :
mathResult = operator1 + operator2 * operator3;
expression = string .Format( " {0} + {1} * {2} = ? " , operator1, operator2, operator3);
break ;
case 1 :
mathResult = operator1 * operator2 + operator3;
expression = string .Format( " {0} * {1} + {2} = ? " , operator1, operator2, operator3);
break ;
default :
mathResult = operator2 + operator1 * operator3;
expression = string .Format( " {0} + {1} * {2} = ? " , operator2, operator1, operator3);
break ;
}
using (Bitmap bmp = new Bitmap( 150 , 25 ))
{
using (Graphics graph = Graphics.FromImage(bmp))
{
graph.Clear(Color.FromA#e8eef7); /// /背景色,可自行设置
/// /画噪点
for ( int i = 0 ; i <= 128 ; i ++ )
{
graph.DrawRectangle(
new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))),
rnd.Next( 2 , 128 ),
rnd.Next( 2 , 38 ),
1 ,
1 );
}
/// /输出表达式
for ( int i = 0 ; i < expression.Length; i ++ )
{
graph.DrawString(expression.Substring(i, 1 ),
new Font(FontFamily.GenericSansSerif, 12 , FontStyle.Bold),
new SolidBrush(Color.FromArgb(rnd.Next( 255 ), rnd.Next( 128 ), rnd.Next( 255 ))),
5 + i * 10 ,
rnd.Next( 1 , 5 ));
}
/// /画边框,不需要可以注释掉
graph.DrawRectangle( new Pen(Color.Firebrick), 0 , 0 , 150 - 1 , 25 - 1 );
}
context.Session[sessionKey] = mathResult; /// /将运算结果存入session
/// /禁用缓存
DisableHttpCache(context);
/// /输出图片到浏览器,我采用的是 gif 格式,可自行设置其他格式
context.Response.ContentType = " image/gif " ;
bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.End();
}
}
#endregion
/// <summary>
/// 禁用缓存
/// </summary>
/// <param name="context"> httpcontext </param>
private static void DisableHttpCache(System.Web.HttpContext context)
{
/// /清除http缓存
context.Response.ClearHeaders();
context.Response.ClearContent();
/// /禁用http缓存
/// / http 1.1
context.Response.AddHeader( " Expires " , " Mon, 26 Jul 1997 05:00:00 GMT " );
context.Response.AddHeader( " Cache-Control " , " no-store, no-cache, max-age=0, must-revalidate " );
/// / http 1.0
context.Response.AddHeader( " Pragma " , " no-cache " );
}
}
注: 如果觉得验证码太模糊,可以将画噪点的地方调整为下面的:
for ( int i = 0 ; i <= 128 ; i ++ )
{
graph.DrawRectangle(
new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))),
( float )rnd.Next( 2 , 128 ),
( float )rnd.Next( 2 , 38 ),
0.5F , // 噪点的粒度
0.5F ); // 噪点的粒度,可以调节这两个值,到认为自己满意
}
// 新建一个 ashx 页面,例如: Mvc.ashx
// 记得此ashx文件的类,一定要继承 System.Web.SessionState.IRequiresSessionState 才可以使用session
public class Mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
MathVerifyCode mvc = new MathVerifyCode();
mvc.OutputImage(context, " mvc " );
}
public bool IsReusable {
get {
return true ;
}
}
}
在需要显示验证码的地方,加入:
< img src = " mvc.aspx " alt = "" /> 或者 < img src = " mvc.ashx " alt = "" />
本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572560.html,如需转载请自行联系原作者
< asp:TextBox ID = " tbck " runat = " server " Width = " 107px " SkinID = " worm " ></ asp:TextBox >
< img alt = " 看不清?点击更换 " onclick = " this.src=this.src+'?' " src = " VerifyCode.aspx " />
< asp:Button ID = " Button1 " runat = " server " OnClick = " Button1_Click " Text = " Button " />
后台代码:
if ( this .tbck.Text == Request.Cookies[ " vCode " ].Value)
{
Response.Write( " 相等 " );
}
////// VerifyCode.aspx
后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
public partial class VerifyCode : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
VerifyCode v = new VerifyCode();
v.Length = this .length;
v.FontSize = this .fontSize;
v.Chaos = this .chaos;
v.BackgroundColor = this .backgroundColor;
v.ChaosColor = this .chaosColor;
v.CodeSerial = this .codeSerial;
v.Colors = this .colors;
v.Fonts = this .fonts;
v.Padding = this .padding;
string code = v.CreateVerifyCode(); // 取随机码
v.CreateImageOnPage(code, this .Context); // 输出图片
Response.Cookies.Add( new HttpCookie( " vCode " , code)); // 使用Cookies取验证码的值
}
// 验证码长度(默认6个验证码的长度)
int length = 4 ;
public int Length
{
get { return length; }
set { length = value; }
}
// 验证码字体大小(为了显示扭曲效果,默认20像素,可以自行修改)
int fontSize = 12 ;
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
// 边框补(默认1像素)
int padding = 1 ;
public int Padding
{
get { return padding; }
set { padding = value; }
}
// 是否输出燥点(默认为输出)
bool chaos = true ;
public bool Chaos
{
get { return chaos; }
set { chaos = value; }
}
// 输出燥点的颜色(默认灰色)
Color chaosColor = Color.LightGray;
public Color ChaosColor
{
get { return chaosColor; }
set { chaosColor = value; }
}
// 自定义背景色(默认白色)
Color backgroundColor = Color.White;
public Color BackgroundColor
{
get { return backgroundColor; }
set { backgroundColor = value; }
}
// 自定义随机颜色数组
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
// 自定义字体数组
string [] fonts = { " Arial " , " Georgia " };
public string [] Fonts
{
get { return fonts; }
set { fonts = value; }
}
// 自定义随机码字符串序列(使用逗号分隔)
// string codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
string codeSerial = " 0,1,2,3,4,5,6,7,8,9 " ;
public string CodeSerial
{
get { return codeSerial; }
set { codeSerial = value; }
}
// 生成校验码图片
public Bitmap CreateImageCode( string code)
{
int fSize = FontSize;
int fWidth = fSize + Padding;
int imageWidth = ( int )(code.Length * fWidth) + 4 + Padding * 2 ;
int imageHeight = fSize * 2 + Padding;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(BackgroundColor);
Random rand = new Random();
// 给背景添加随机生成的燥点
if ( this .Chaos)
{
Pen pen = new Pen(ChaosColor, 0 );
int c = Length * 15 ;
for ( int i = 0 ; i < c; i ++ )
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(pen, x, y, 1 , 1 );
}
}
int left = 0 , top = 0 , top1 = 1 , top2 = 1 ;
int n1 = (imageHeight - FontSize - Padding * 2 );
int n2 = n1 / 4 ;
top1 = n2;
top2 = n2 * 2 ;
Font f;
Brush b;
int cindex, findex;
// 随机字体和颜色的验证码字符
for ( int i = 0 ; i < code.Length; i ++ )
{
cindex = rand.Next(Colors.Length - 1 );
findex = rand.Next(Fonts.Length - 1 );
f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
b = new System.Drawing.SolidBrush(Colors[cindex]);
if (i % 2 == 1 )
{
top = top2;
}
else
{
top = top1;
}
left = i * fWidth;
g.DrawString(code.Substring(i, 1 ), f, b, left, top);
}
// 画一个边框 边框颜色为Color.White
g.DrawRectangle( new Pen(Color.White, 0 ), 0 , 0 , image.Width - 1 , image.Height - 1 );
g.Dispose();
return image;
}
// 将创建好的图片输出到页面
public void CreateImageOnPage( string code, HttpContext context)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Bitmap image = this .CreateImageCode(code);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = " image/jpeg " ;
context.Response.BinaryWrite(ms.GetBuffer());
ms.Close();
ms = null ;
image.Dispose();
image = null ;
}
// 生成随机字符码
public string CreateVerifyCode( int codeLen)
{
if (codeLen == 0 )
{
codeLen = Length;
}
string [] arr = CodeSerial.Split( ' , ' );
string code = "" ;
int randValue = - 1 ;
Random rand = new Random( unchecked (( int )DateTime.Now.Ticks));
for ( int i = 0 ; i < codeLen; i ++ )
{
randValue = rand.Next( 0 , arr.Length - 1 );
code += arr[randValue];
}
return code;
}
public string CreateVerifyCode()
{
return CreateVerifyCode( 0 );
}
}
/// <summary>
/// 数学算式的验证码
/// http://www.zu14.cn/2008/11/22/net_math_vc/
/// Author: DeltaCat (三角猫)
/// </summary>
public sealed class MathVerifyCode
{
#region 生成图片
/// <summary>
/// 输出验证码表达式到浏览器
/// </summary>
/// <param name="context"> httpcontext </param>
/// <param name="sessionKey"> 保存运算值的SESSION的KEY </param>
public void OutputImage(System.Web.HttpContext context, string sessionKey)
{
int mathResult = 0 ;
string expression = null ;
Random rnd = new Random();
/// /生成3个10以内的整数,用来运算
int operator1 = rnd.Next( 0 , 10 );
int operator2 = rnd.Next( 0 , 10 );
int operator3 = rnd.Next( 0 , 10 );
/// /随机组合运算顺序,只做 + 和 * 运算
switch (rnd.Next( 0 , 3 ))
{
case 0 :
mathResult = operator1 + operator2 * operator3;
expression = string .Format( " {0} + {1} * {2} = ? " , operator1, operator2, operator3);
break ;
case 1 :
mathResult = operator1 * operator2 + operator3;
expression = string .Format( " {0} * {1} + {2} = ? " , operator1, operator2, operator3);
break ;
default :
mathResult = operator2 + operator1 * operator3;
expression = string .Format( " {0} + {1} * {2} = ? " , operator2, operator1, operator3);
break ;
}
using (Bitmap bmp = new Bitmap( 150 , 25 ))
{
using (Graphics graph = Graphics.FromImage(bmp))
{
graph.Clear(Color.FromA#e8eef7); /// /背景色,可自行设置
/// /画噪点
for ( int i = 0 ; i <= 128 ; i ++ )
{
graph.DrawRectangle(
new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))),
rnd.Next( 2 , 128 ),
rnd.Next( 2 , 38 ),
1 ,
1 );
}
/// /输出表达式
for ( int i = 0 ; i < expression.Length; i ++ )
{
graph.DrawString(expression.Substring(i, 1 ),
new Font(FontFamily.GenericSansSerif, 12 , FontStyle.Bold),
new SolidBrush(Color.FromArgb(rnd.Next( 255 ), rnd.Next( 128 ), rnd.Next( 255 ))),
5 + i * 10 ,
rnd.Next( 1 , 5 ));
}
/// /画边框,不需要可以注释掉
graph.DrawRectangle( new Pen(Color.Firebrick), 0 , 0 , 150 - 1 , 25 - 1 );
}
context.Session[sessionKey] = mathResult; /// /将运算结果存入session
/// /禁用缓存
DisableHttpCache(context);
/// /输出图片到浏览器,我采用的是 gif 格式,可自行设置其他格式
context.Response.ContentType = " image/gif " ;
bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.End();
}
}
#endregion
/// <summary>
/// 禁用缓存
/// </summary>
/// <param name="context"> httpcontext </param>
private static void DisableHttpCache(System.Web.HttpContext context)
{
/// /清除http缓存
context.Response.ClearHeaders();
context.Response.ClearContent();
/// /禁用http缓存
/// / http 1.1
context.Response.AddHeader( " Expires " , " Mon, 26 Jul 1997 05:00:00 GMT " );
context.Response.AddHeader( " Cache-Control " , " no-store, no-cache, max-age=0, must-revalidate " );
/// / http 1.0
context.Response.AddHeader( " Pragma " , " no-cache " );
}
}
注: 如果觉得验证码太模糊,可以将画噪点的地方调整为下面的:
for ( int i = 0 ; i <= 128 ; i ++ )
{
graph.DrawRectangle(
new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))),
( float )rnd.Next( 2 , 128 ),
( float )rnd.Next( 2 , 38 ),
0.5F , // 噪点的粒度
0.5F ); // 噪点的粒度,可以调节这两个值,到认为自己满意
}
// 新建一个 ashx 页面,例如: Mvc.ashx
// 记得此ashx文件的类,一定要继承 System.Web.SessionState.IRequiresSessionState 才可以使用session
public class Mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
MathVerifyCode mvc = new MathVerifyCode();
mvc.OutputImage(context, " mvc " );
}
public bool IsReusable {
get {
return true ;
}
}
}
在需要显示验证码的地方,加入:
< img src = " mvc.aspx " alt = "" /> 或者 < img src = " mvc.ashx " alt = "" />
本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572560.html,如需转载请自行联系原作者