博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
漂亮彩色验证码 以及 数学运算表达式形式的验证码
阅读量:6630 次
发布时间:2019-06-25

本文共 8316 字,大约阅读时间需要 27 分钟。

前台代码:
 
<
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>
///
 数学算式的验证码  
///  
///  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,如需转载请自行联系原作者
你可能感兴趣的文章
一名女程序员对iOS的想法
查看>>
Spring Websocket实现文本、图片、声音、文件下载及推送、接收及显示(集群模式)...
查看>>
最严新规发布 网络短视频平台该如何降低违规风险? ...
查看>>
云服务器ECS出现速度变慢 以及突然断开怎么办?
查看>>
208亿背后的“秘密”
查看>>
Android系统自带样式(android:theme)解析
查看>>
全志A33开发板Linux内核定时器编程
查看>>
全栈必备 敏捷估点
查看>>
作为一名合格的JAVA架构师需要点亮哪些技能树?
查看>>
为什么短视频会让人刷不停?背后也许用了这套技术
查看>>
Kubernetes 在知乎上的应用
查看>>
Fescar 发布 0.3.1 版本, 支持 ZooKeeper 注册中心
查看>>
【死磕 Spring】----- IOC 之解析 bean 标签:BeanDefinition
查看>>
4.1 在SELinux中客体类存在的目的
查看>>
基础为重,Python的基础,成就月薪过万
查看>>
PHP浮点数的精确计算BCMath
查看>>
H.264学习笔记之一(层次结构,NAL,SPS)
查看>>
Radware:IP欺诈等让网络攻击难以防范
查看>>
基于Token认证的WebSocket连接
查看>>
【Solidity】2.合约的结构体 - 深入理解Solidity
查看>>