本文实例讲述了asp.net使用ashx生成图形验证码的方法。分享给大家供大家参考,具体如下:
验证码的好处不用我多说,你们都懂的。我在网上看到有人把验证码直接写在aspx页面里,也就是说这种方式请求验证码等于请求一个页面,这样做很不科学。如下所示
1
2
3
4
5
6
7
8
|
< form id = "form1" runat = "server" >
< div >
< asp:Image ID = "Image1" runat = "server" ImageUrl = "Default.aspx" />
< br />
< asp:TextBox ID = "TextBox1" runat = "server" ></ asp:TextBox >
< asp:Button ID = "Button1" runat = "server" onclick = "Button1_Click" Text = "Button" />
</ div >
</ form >
|
这个代码看着就觉得写代码的人比较欠揍,代码写成这样子着实郁闷。验证吗也不写点script做下切换。
下面我介绍一种方式来实现这样的功能
1. 写个ashx生成图形验证码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Web.SessionState;
using System.Drawing;
namespace usechecknum.ashx
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/" )]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class doCreateNum : IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html" ;
string checkCode = GetValidation(5); // 产生5位随机验证码字符
context.Session[ "Code" ] = checkCode; //将字符串保存到Session中,以便需要时进行验证
System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
// 画图片的背景噪音线
int i;
for (i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine( new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new System.Drawing.Font( "Arial" , 12, (System.Drawing.FontStyle.Bold));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush( new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true );
g.DrawString(checkCode, font, brush, 2, 2);
//画图片的前景噪音点
g.DrawRectangle( new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/Gif" ;
context.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
public string GetValidation( int num)
{
string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; //"或者写汉字也行"
string validatecode = "" ;
Random rd = new Random();
for ( int i = 0; i < num; i++)
{
validatecode += str.Substring(rd.Next(0, str.Length), 1);
}
return validatecode;
}
public bool IsReusable
{
get
{
return false ;
}
}
}
}
|
2. 在页面上显示验证码,因为我们生成的是图形,所以可以直接写在<img/>标签里,我们只要写段简单的脚本就可以点击鼠标切换验证码了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<%@ Page Language= "C#" AutoEventWireup= "true" CodeBehind= "index.aspx.cs" Inherits= "usechecknum._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head runat= "server" >
<title>验证码的使用</title>
</head>
<script language= "javascript" type= "text/javascript" >
function changeCode() {
var imgNode = document.getElementById( "vimg" );
imgNode.src = "ashx/doCreateNum.ashx?t=" + ( new Date()).valueOf(); // 这里加个时间的参数是为了防止浏览器缓存的问题
}
</script>
<body>
<form id= "form1" runat= "server" >
请输入验证码:<input type= "text" name= "checknum" /><img src= "ashx/doCreateNum.ashx" id= "vimg" onclick= "changeCode()" />
</form>
</body>
</html>
|
说了半天,该是时候看看生成的验证码长什么样了
希望本文所述对大家asp.net程序设计有所帮助。