关闭

.net中的图片验证

970人阅读 评论(0) 收藏 举报

为了防止恶意访问,现在的登录页面一般都有一个验证框。

系统首先生成一个随机数,保存在session中,并且显示成bitmap格式,用户输入正确的数字方可登录。

这个是页面的后台代码,只要建立好前台页面后把下面的代码拷贝过去就行了

在需要调用验证码的地方用下面这样的代码调用就行了

<img src="../PageControl/Security/ValidateCode.aspx?codeLen=5&aFineness=90&ImgWidth=85&PosX=4&PosY=1&FontFamily=Arial&FontSize=14&FontStyle=3"></img>

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace VerCommunity.WebForum.PageCtrl.Security
{
 /// <summary>
 /// ValidateCode 验证码生成页
 /// </summary>
 public class ValidateCode : System.Web.UI.Page
 {
  // 验证码长度
  private int codeLen=8;
  // 图片清晰度
  private int fineness=80;
  // 图片宽度
  private int imgWidth=128;
  // 图片高度
  private int imgHeight=24;
  // 字体家族名称
  private string fontFamily="Times New Roman";
  // 字体大小
  private int fontSize=14;
  // 字体样式
  private int fontStyle=0;
  // 绘制起始坐标 X
  private int posX=0;
  // 绘制起始坐标 Y
  private int posY=0;

  //------------------------------------------------------------
  // ValidateCode.aspx 页面加载函数
  //------------------------------------------------------------
  private void Page_Load(object sender, System.EventArgs e)
  {
   #region 读取 Request 传递参数
   // 获取代码长度设置
   if(Request["CodeLen"]!=null)
   {
    try
    {
     codeLen=Int32.Parse(Request["CodeLen"]);

     // 规定验证码长度
     if(codeLen<4 || codeLen>16)
      throw new Exception("验证码长度必须在4到16之间");
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 获取图片清晰度设置
   if(Request["Fineness"]!=null)
   {
    try
    {
     fineness=Int32.Parse(Request["Fineness"]);

     // 验证清晰度
     if(fineness<0 || fineness>100)
      throw new Exception("图片清晰度必须在0到100之间");
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 获取图片宽度
   if(Request["ImgWidth"]!=null)
   {
    try
    {
     imgWidth=Int32.Parse(Request["ImgWidth"]);

     if(imgWidth<16 || imgWidth>480)
      throw new Exception("图片宽度必须在16到480之间");
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 获取图片高度
   if(Request["ImgHeight"]!=null)
   {
    try
    {
     imgWidth=Int32.Parse(Request["ImgHeight"]);

     if(imgWidth<16 || imgWidth>320)
      throw new Exception("图片高度必须在16到320之间");
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 获取验证码字体家族名称
   if(Request["FontFamily"]!=null)
   {
    fontFamily=Request["FontFamily"];
   }

   // 获取验证码字体大小
   if(Request["FontSize"]!=null)
   {
    try
    {
     fontSize=Int32.Parse(Request["FontSize"]);

     if(fontSize<8 || fontSize>72)
      throw new Exception("字体大小必须在8到72之间");
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 获取字体样式
   if(Request["FontStyle"]!=null)
   {
    try
    {
     fontStyle=Int32.Parse(Request["FontStyle"]);
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 验证码绘制起始位置 X
   if(Request["PosX"]!=null)
   {
    try
    {
     posX=Int32.Parse(Request["PosX"]);
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }

   // 验证码绘制起始位置 Y
   if(Request["PosY"]!=null)
   {
    try
    {
     posY=Int32.Parse(Request["PosY"]);
    }
    catch(Exception Ex)
    {
     throw Ex;
    }
   }
   #endregion

   string validateCode=CreateValidateCode();

   // 生成BITMAP图像
   Bitmap bitmap=new Bitmap(imgWidth, imgHeight);

   // 给图像设置干扰
   DisturbBitmap(bitmap);

   // 绘制验证码图像
   DrawValidateCode(bitmap, validateCode);

   // 保存验证码图像,等待输出
   bitmap.Save(Response.OutputStream, ImageFormat.Gif);
  }

  #region Web 窗体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
  }
  
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {   
   this.Load += new System.EventHandler(this.Page_Load);
  }
  #endregion

  //------------------------------------------------------------
  // 随机生成验证码,并保存到SESSION中
  //------------------------------------------------------------
  private string CreateValidateCode()
  {
   string validateCode="";

   // 随机数对象
   Random random=new Random();

   for(int i=0; i<codeLen; i++)
   {
    // 26: a - z
    int n=random.Next(26);

    // 将数字转换成大写字母
    validateCode+=(char)(n+65);
   }

   // 保存验证码
   Session["ValidateCode"]=validateCode;

   return validateCode;
  }

  //------------------------------------------------------------
  // 为图片设置干扰点
  //------------------------------------------------------------
  private void DisturbBitmap(Bitmap bitmap)
  {
   // 通过随机数生成
   Random random=new Random();

   for(int i=0; i<bitmap.Width; i++)
   {
    for(int j=0; j<bitmap.Height; j++)
    {
     if(random.Next(100)<=this.fineness)
      bitmap.SetPixel(i, j, Color.White);
    }
   }
  }

  //------------------------------------------------------------
  // 绘制验证码图片
  //------------------------------------------------------------
  private void DrawValidateCode(Bitmap bitmap, string validateCode)
  {
   // 获取绘制器对象
   Graphics g=Graphics.FromImage(bitmap);

   // 设置绘制字体
   Font font=new Font(fontFamily, fontSize, GetFontStyle());

   // 绘制验证码图像
   g.DrawString(validateCode, font, Brushes.Black, posX, posY);
  }

  //------------------------------------------------------------
  // 换算验证码字体样式:1 粗体 2 斜体 3 粗斜体,默认为普通字体
  //------------------------------------------------------------
  private FontStyle GetFontStyle()
  {
   if(fontStyle==1)
    return FontStyle.Bold;
   else if(fontStyle==2)
    return FontStyle.Italic;
   else if(fontStyle==3)
    return FontStyle.Bold | FontStyle.Italic;
   else
    return FontStyle.Regular;
  }
 }
}

 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1772919 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35498次
    • 积分:542
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:11篇
    • 译文:0篇
    • 评论:11条
    文章分类