您的位置:首页 > 编程语言 > ASP

ASP.NET——验证码的制作

2014-07-25 16:31 267 查看
        我们在登陆网站,发表博客或者提交评论的时候,经常会遇到填写验证码这一项,当时感觉挺神奇的样子,终于在牛腩新闻发布系统里接触到了,在这里小小的总结下。

        用到的东东有三个:一个aspx页面,一个图片

        首先,建立一个aspx页面。        



<%@ WebHandler Language="C#" Class="Picture" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web.SessionState;

public class Picture : IHttpHandler, IRequiresSessionState
// 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
{

public void ProcessRequest(HttpContext context)
{
string checkCode = GenCode(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();
}
}

/// <summary>
/// 产生随机字符串
/// </summary>
/// <param name="num">随机出几个字符</param>
/// <returns>随机出的字符串</returns>
private string GenCode(int num)
{
string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] chastr = str.ToCharArray();

string code = "";
Random rd = new Random();
int i;
for (i = 0; i < num; i++)
{
//code += source[rd.Next(0, source.Length)];
code += str.Substring(rd.Next(0, str.Length), 1);
}
return code;
}

public bool IsReusable
{
get
{
return false;
}
}
}
           其次,在用到验证码的界面添加一个img控件,并且src属性指向.ashx文件。



<img src="handler/WaterMark.ashx" id="vimg" alt="" onclick="changeCode()"/>

        然后,判断提交的验证码是否正确。       



//判断验证码是否输入正确
string code = txtCode.Text.Trim().ToUpper();//将输入的字母都转化成大写然后作比较
string rightCode = Session["Code"].ToString();
if(code!=rightCode )
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");//提示错误保证后面背景不变白

return;
}


        最后,使用JavaScrip来刷新验证码。因为代码比较少,所以可以嵌套在代码中。        



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
<script language="javascript" type="text/javascript">
function changeCode() {
var imgNode = document.getElementById("vimg");
imgNode.src = "handler/WaterMark.ashx?t=" + (new Date()).valueOf();  // 这里加个时间的参数是为了防止浏览器缓存的问题
}
</script>
</asp:Content>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: