網站的論壇使用垃圾動網論壇,近一個月內,論壇幾乎成了垃圾信息的集散地,雖然有多個版主幫忙刪貼,但還是搞得焦頭爛額,論壇已經有一定的貼子,現在想換論壇太麻煩了,那些垃圾信息都是自動注冊,自動發貼。看來要防止這些自動發貼的軟件,只能從防止自動注冊入手,動網的驗證碼太過簡單,普通的識別軟件就能識別成功。於是想利用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
>
