网站的论坛使用垃圾动网论坛,近一个月内,论坛几乎成了垃圾信息的集散地,虽然有多个版主帮忙删贴,但还是搞得焦头烂额,论坛已经有一定的贴子,现在想换论坛太麻烦了,那些垃圾信息都是自动注册,自动发贴。看来要防止这些自动发贴的软件,只能从防止自动注册入手,动网的验证码太过简单,普通的识别软件就能识别成功。于是想利用ASP.NET强大的GDI+功能来生成中文验证码。因为以前写过ASP.net利用GDI处理图片的功能,现在稍微改一下就可以生成验证码,效果还可以。验证码是从一段中文文字中取出4个字组成的,文字颜色、字体都是随机生成,杂色点也是随机生成。
,

但在最后,即因为Session不能共享,而无法使用。因为ASP的Session保存在内存中,ASP和ASP.net不在同一进程,不同进程序无法共享内存,造成ASP和ASP.net不能共享Session数据。
在网上虽然有很多方法达到差不多的效果,但那些方法都不适合用于验证码。
本来以为ASP和ASP.net都是MS的东西,这些对像应该能共用的,没想到居然是这个样子。
下面的生成中文验证码的代码,那些中文字符没有利用随机数生成中文的编码的方法,因为那样生成的中文字符有可能太过复杂,比如一些比较复杂的繁体字,所以这些中文字符只是来自一段中文的简介。虽然不长,但能应付一般的情况。
<%
@ Page Language
=
"
C#
"
ContentType
=
"
image/gif
"
%>
<%
@ Import Namespace
=
"
System.Drawing
"
%>
<%
@ Import Namespace
=
"
System.Web.SessionState
"
%>


<
script runat
=
"
server
"
>
//
Filename:dv_getcode.aspx
protected
void
Page_Load(
object
sender, EventArgs e)

...
{
Bitmap image = new Bitmap(72,18);

Graphics g = Graphics.FromImage(image);
g.Clear(Color.FromArgb(0xFF,0xFF,0xFF));

Font drawFont;
PointF drawPoint;
SolidBrush drawBrush;
string[] fonts = new string[3];
string randomString=getRandomString();
//Session("GetCode")=randomString;

fonts[0]="宋体";
fonts[1]="隶书";
fonts[2]="楷体";


Random random = new Random();


for(int i=0;i<100;i++)...{
image.SetPixel(random.Next(72),random.Next(18),Color.FromArgb(random.Next(255),random.Next(255),random.Next(255)));
}

drawFont = new Font(fonts[random.Next(3)], 13);
drawPoint = new PointF(0.0F, 0.0F);
drawBrush = new SolidBrush(Color.FromArgb(100+random.Next(155),100+random.Next(155),0));
g.DrawString(randomString.Substring(0,1), drawFont, drawBrush, drawPoint);

drawFont = new Font(fonts[random.Next(3)], 13);
drawPoint = new PointF(18.0F, 0.0F);
drawBrush = new SolidBrush(Color.FromArgb(0,100+random.Next(155),100+random.Next(155)));
g.DrawString(randomString.Substring(1,1), drawFont, drawBrush, drawPoint);

drawFont = new Font(fonts[random.Next(3)], 13);
drawPoint = new PointF(36.0F, 0.0F);
drawBrush = new SolidBrush(Color.FromArgb(100+random.Next(155),0,100+random.Next(155)));
g.DrawString(randomString.Substring(2,1), drawFont, drawBrush, drawPoint);

drawFont = new Font(fonts[random.Next(3)], 13);
drawPoint = new PointF(54.0F, 0.0F);
drawBrush = new SolidBrush(Color.FromArgb(0,0,100+random.Next(155)));
g.DrawString(randomString.Substring(3,1), drawFont, drawBrush, drawPoint);


image.Save(Response.OutputStream , System.Drawing.Imaging.ImageFormat.Gif );
}



string
getRandomString()
...
{
Random ro = new Random(unchecked((int)DateTime.Now.Ticks));
string txt="澄海义工社是由澄海茶座爱心小组发展而来澄海茶座爱心小组创建于年当时在E京澄海茶座论坛上由一群热心网友发起成立以网络为平台在网上发贴发动网友募捐善款开展助学救困活动经过几年的发展澄海茶座爱心小组也从一个网络组织走到了现实世界社会上众多的爱心人士纷纷投身到爱心活动中来他们中有机关干部普通打工者老师私企老板等等爱心小组严格遵循先调查落实情况再确定助学救困对象的原则使基金每一分每一厘都用到确实有实际困难需要救助的对象身上多年来通过澄海茶座爱心小组资助的对象遍及澄海各乡镇年开始澄海茶座爱心小组成员经过多番努力在澄海区进行爱心助学扶贫救急活动筹得善款近多万元资助贫困学生近多人并开展帮助学活动固定每月援助部分贫困学生家庭元使这些贫困学生得以继续学业为了使这支队伍更加健康的发展澄海茶座爱心小组正式更名为澄海爱心义工社成为一个正式的义工组织并以参与互助奉献进步作为义工社的宗旨计划在未来以扶贫助困跟助学两条线为主轴开展各种爱心活动并且将我们的爱心无限的延伸";
return txt.Substring(1+ro.Next(txt.Length-4),4);
}

</
script
>
