这篇文章主要介绍了asp.net使用ashx生成图形验证码的方法,结合实例形式分析了asp.net生成图形验证码的步骤、实现方法与相关注意事项,需要的朋友可以参考下
本文实例讲述了asp.net使用ashx生成图形验证码的方法。分享给大家供大家参考,具体如下:
验证码的好处不用我多说,你们都懂的。我在网上看到有人把验证码直接写在aspx页面里,也就是说这种方式请求验证码等于请求一个页面,这样做很不科学。如下所示
<form id="form1" runat="server">
<p>
<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" />
</p>
</form>
这个代码看着就觉得写代码的人比较欠揍,代码写成这样子着实郁闷。验证吗也不写点script做下切换。
下面我介绍一种方式来实现这样的功能
1. 写个ashx生成图形验证码
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/>标签里,我们只要写段简单的脚本就可以点击鼠标切换验证码了
<%@ 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利用ashx实现验证码功能详解的详细内容。