利用HttpHandler实现验证码
span style="font-size: 12pt">输出图片并保存验证码在Session里面。
![](/Images/OutliningIndicators/ContractedBlock.gif)
ValidateCode.ashx
1
<%@ WebHandler Language="C#" Class="ValidateCode" %>
2![](/Images/OutliningIndicators/None.gif)
3
using System;
4
using System.Web;
5
using System.Web.SessionState;
6![](/Images/OutliningIndicators/None.gif)
7![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
8
/// 验证码程序
9
/// </summary>
10
public class ValidateCode : IHttpHandler, IRequiresSessionState
11![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
12![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
13
/// 入口
14
/// </summary>
15
/// <param name="context"></param>
16
public void ProcessRequest(HttpContext context)
17![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18
string checkCode = CreateRandomCode(4);
19
context.Session["Code"] = checkCode;
20
CreateImage(checkCode, context);
21
}
22![](/Images/OutliningIndicators/InBlock.gif)
23
public bool IsReusable
24![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25
get
26![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27
return false;
28
}
29
}
30![](/Images/OutliningIndicators/InBlock.gif)
31![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
32
/// 产生验证码
33
/// </summary>
34
/// <param name="codeCount"></param>
35
/// <returns></returns>
36
private string CreateRandomCode(int codeCount)
37![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
38
//验证码中的出现的字符,避免了一些容易混淆的字符。
39
string allChar = "3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,W,X,Y";
40
string[] allCharArray = allChar.Split(',');
41
string randomCode = "";
42
int temp = -1;
43![](/Images/OutliningIndicators/InBlock.gif)
44
Random rand = new Random();
45
for (int i = 0; i < codeCount; i++)
46![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
47
if (temp != -1)
48![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
49
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
50
}
51
int t = rand.Next(allCharArray.Length);
52
if (temp == t)
53![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
54
return CreateRandomCode(codeCount);
55
}
56
temp = t;
57
randomCode += allCharArray[t];
58
}
59
return randomCode;
60
}
61![](/Images/OutliningIndicators/InBlock.gif)
62![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
63
/// 创建图片
64
/// </summary>
65
/// <param name="checkCode"></param>
66
/// <param name="context"></param>
67
private void CreateImage(string checkCode, HttpContext context)
68![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
69
int iwidth = (int)(checkCode.Length * 12);
70
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
71
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
72
g.Clear(System.Drawing.Color.White);
73
//定义颜色
74![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
System.Drawing.Color[] c =
{ System.Drawing.Color.DimGray, System.Drawing.Color.DimGray, System.Drawing.Color.DimGray };
75
//定义字体
76![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string[] font =
{ "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
77
Random rand = new Random();
78
//随机输出噪点
79
for (int i = 0; i < 50; i++)
80![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
81
int x = rand.Next(image.Width);
82
int y = rand.Next(image.Height);
83
g.DrawRectangle(new System.Drawing.Pen(System.Drawing.Color.LightGray, 0), x, y, 1, 1);
84
}
85![](/Images/OutliningIndicators/InBlock.gif)
86
//输出不同字体和颜色的验证码字符
87![](/Images/OutliningIndicators/InBlock.gif)
88
for (int i = 0; i < checkCode.Length; i++)
89![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
90
int cindex = rand.Next(3);
91
int findex = rand.Next(1);
92![](/Images/OutliningIndicators/InBlock.gif)
93
System.Drawing.Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
94
System.Drawing.Brush b = new System.Drawing.SolidBrush(c[cindex]);
95
int ii = 4;
96
if ((i + 1) % 2 == 0)
97![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
98
ii = 2;
99
}
100
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 10), ii);
101
}
102
//画一个边框
103![](/Images/OutliningIndicators/InBlock.gif)
104
g.DrawRectangle(new System.Drawing.Pen(System.Drawing.Color.DarkGray, 0), 0, 0, image.Width - 1, image.Height - 1);
105![](/Images/OutliningIndicators/InBlock.gif)
106
//输出到浏览器
107
System.IO.MemoryStream ms = new System.IO.MemoryStream();
108
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
109
context.Response.ClearContent();
110
context.Response.ContentType = "image/Jpeg";
111
context.Response.BinaryWrite(ms.ToArray());
112
g.Dispose();
113
image.Dispose();
114
}
115![](/Images/OutliningIndicators/InBlock.gif)
116
}
117
注意:
必须继承System.Web.SessionState.IRequiresSessionState接口,才能实现Session读写!
System.Web.SessionState的一些接口
IReadOnlySessionState 指定目标 HTTP 处理程序只需要具有对会话状态值的读访问权限。这是一个标记接口,没有任何方法。
IRequiresSessionState 指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
117
![](/Images/OutliningIndicators/None.gif)
--------------------------------------------------
页面调用<img src="ashx文件地址">
判断验证码是否正确
Session["Code"].ToString()==输入的字符