asp.net中验证码的生成和引用

来源:互联网 发布:如何设计软件iphone 编辑:程序博客网 时间:2024/06/13 13:47
        
        分类:            程序开发                   234人阅读     评论(0)    收藏     举报    
asp.netrandomimagejavascriptstringsession

验证码主要是为防止有人利用程序恶意大量注册或者发帖,造成服务器资源紧张而产生的,我见过的有两种:一种是最简单的,利用随机数生成几个随机的数字并直接显示成文本,这种不太具有可用性,因为文本的还是不太安全。还有一种就是现在常见的把生成的随机数或字母显示到图片上,并在图片上加干扰线和颜色的方式。今天做了一个第二种的,把代码帖下来。

大体的思路是:先生成随机数或随机字符串,然后将随机数或字符串写入到一个新建的image对象上(该对象可以事先画好干扰线或点),接着将该对象写到内存中,并把随机字符串用Session或Cookie保存下来以备对比。在新的一页中建立一个img标记,或asp:Image对象,把src属性指定到生成随机数图片的页面,如src="CheckCode.aspx",并使用JS的方式实现页面不刷新而验证码刷新。具体代码如下:

//CheckCode.aspx.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public partial class imgs_CheckCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
createCheckCodeImage(generateRadamCode());
}

private string generateRadamCode()
{
string checkCode = String.Empty;
char code;
int number;
Random random = new Random();
for (int i = 0; i < 5; i++)
{
number = random.Next(0,51);
if (number % 26 == 0)
{
code = (char)('A' + (number+1) / 26);
}
else
{
code = (char)('A' + number % 26);
}
if (checkCode.Contains(code.ToString()))
{
i--;
}
else
{
checkCode += code.ToString();
}
}
Session["CheckCode"] = checkCode;
return checkCode;
}

private void createCheckCodeImage(string checkCode)
{
if (checkCode == null || checkCode.Trim() == string.Empty)
{ return; }
Bitmap image = new Bitmap((int)Math.Ceiling(checkCode.Length * 12.5),22);
Graphics g = Graphics.FromImage(image);
try
{
Random random = new Random();
g.Clear(Color.White);
for (int 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.GreenYellow), x1, x2, y1, y2);
}
Font font = new Font("Verdana", 10, (FontStyle.Bold | FontStyle.Italic));
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(checkCode, font, brush, 2, 2);
for (int i = 0; i < 80; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
g.DrawRectangle(new Pen(Color.Red), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif"
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
}

 

//在其他页中引用

//写在head标记中的JS

<script type="text/javascript" language="javascript">
function reloadCode() {
var obj=document.getElementById('ImageCode');
obj.src = "imgs/CheckCode.aspx?" + Math.random();
}
</script>

//显示验证码的图片

<img id="ImageCode" src="imgs/CheckCode.aspx" alt="验证码" onclick="reloadCode();" style="Cursor:pointer;padding-left:2px;"/>

 

上面的代码大部分都是来自网络,根据自己情况修改了一下。

另外,刷新验证码的JS这样写可以限制刷新验证码的次数

    <script type="text/javascript" language="javascript">
        count = 0;
        function reloadCode() {
            if(count!=5)
            {
                var obj=document.getElementById('ImageCode');
                obj.src = "imgs/CheckCode.aspx?" + Math.random();
                count++;
            }
            else
            {
                alert('刷新验证码次数过多!');
            }
            return false;
        }
    </script>

另外,在JS中引用服务器控件使用getElementById方法,ID需要写成<%=ImageCode.ClientID%>,否则找不到该对象。

原创粉丝点击