.NET使用一般处理程序生成验证码

转自:http://niunan.javaeye.com/blog/252335

HTML代码:

<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.01 Transitional//EN " >
< html >
  
< head >
    
< title ></ title >
    
< meta http - equiv = " Content-Type "  content = " text/html; charset=UTF-8 "   />
    
< script type = " text/javascript " >
        function change() {
            var imgNode 
=  document.getElementById( " vimg " );
            imgNode.src 
=   " WaterMark.ashx?t= "   +  ( new  Date()).valueOf();   //  这里加个时间的参数是为了防止浏览器缓存的问题
        }
    
</ script >
  
</ head >
  
< body >
    
< img src = " WaterMark.ashx "  id = " vimg "  alt = ""   />< input type = " button "  value = " 换一张图片 "  onclick = " change() "   />
  
</ body >
</ html >

一般处理程序WaterMark.ashx的代码:
<% @ WebHandler Language = " C# "  Class = " WaterMark "   %>

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

public   class  WaterMark : 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[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
         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 ;
        }
    }

}


 

你可能感兴趣的:(.net)