验证码 C#版本

 using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Entities;
using ServiceImpls;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

public partial class admin_reg : System.Web.UI.Page
{  
    private  const  double PI  = 3.14159265358979;
    private const double PI2 = 6.28318530717959;
  public   System.Drawing.Bitmap Img;
    protected void Page_Load(object sender, EventArgs e)
    {   
       
        Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); //不缓存;
       int   x, y, x1;
        float y1;
         int PenWidth1, PenWidth2;
        int VerifyVharFont;
         string  VerifyChar = RndChar(4); //RndChar是一个自定义函数;
      
         Graphics g;
         Brush backBrush = Brushes.DimGray;
         Brush textBrush = Brushes.Black;
        VerifyVharFont = Convert.ToInt32(7 * Convert.ToInt32(new Random().NextDouble())) + 14 ; //验证码字符字体大小随机生成;
        Font  textFont = new Font("Arial", VerifyVharFont, FontStyle.Strikeout);  //验证码字体;
         MemoryStream ms;
         int gWidth = Convert.ToInt32((VerifyChar.Length)) * VerifyVharFont + VerifyVharFont; //验证区宽度。如果字符都为W,不加宽是
        Img = new Bitmap(gWidth, 20) ; //验证区高度;

         //生成随机背景颜色
          int nRed, nGreen,  nBlue ;// 背景的三元色;
        Random  rd = new Random();  //(CInt(System.DateTime.Now.Ticks));
        nRed = rd.Next(255) % 128 + 128;
        nGreen =rd.Next(255) % 128 + 128;
        nBlue = rd.Next(255) % 128 + 128;

        //在图片框picCanvas上面建立一个新的空白Graphics
        g = Graphics.FromImage(Img);

        //填充位图背景
        g.FillRectangle(new SolidBrush(System.Drawing.Color.FromArgb(nRed, nGreen, nBlue)), 0, 0, Img.Width, Img.Height);

        //随机输出噪音线
         Int32 i;
        for ( i = 0 ; i <= 2;i++)
        {
            //Randomize();
            x = Img.Width * Convert.ToInt32(new Random().NextDouble());
            y = Img.Height * Convert.ToInt32(new Random().NextDouble());
            x1 = Img.Width * Convert.ToInt32(new Random().NextDouble());
            y1 = Img.Height * Convert.ToInt32(new Random().NextDouble());
            PenWidth1 = 2 * Convert.ToInt32(new Random().NextDouble());
    
            g.DrawLine(new Pen(backBrush, PenWidth1), x, y, x1, y1);
        }

          //随机输出噪点
        PenWidth2 = 2; //修改参数可获得不同的效果;
        for ( i = 0 ; i <= 10;i++)
        {
           // Randomize();
            x = Img.Width * Convert.ToInt32(new Random().NextDouble());
            y = Img.Height * Convert.ToInt32(new Random().NextDouble());
            nRed = rd.Next(255) % 128 + 128;
            nGreen =rd.Next(255) % 128 + 128;
            nBlue = rd.Next(255) % 128 + 128;
            g.DrawRectangle(new Pen(Color.FromArgb(nRed, nGreen, nBlue), PenWidth2), x, y, 1, 1);
        }
            //文字的位置
        x = 16 * Convert.ToInt32(new Random().NextDouble()) - 6 ;//随机产生X轴位置,增加程序识别难度;
        y = 0;

            //随机画3D背景
         float S3d = Convert.ToInt32(new Random().NextDouble());
        if ( S3d > 0.9 )
        {
            for (  i = 1 ; i <= 0 ;i--)
            {
                g.DrawString(VerifyChar, textFont, backBrush, x - i, y + i);
            }
        }

          //将全局变换平移(x, y),也就是使画布上将要画的所有内容向左边移动x,向下移动y
        g.TranslateTransform(1.5f, 1);

        //做切变,将原始矩形的下边缘水平移动矩形高度的0.2倍
         Matrix textTransform = g.Transform;
        textTransform.Shear(0.2f, 0);
        g.Transform = textTransform;

        //画出文字
        g.DrawString(VerifyChar, textFont, textBrush, x, y);
        this.Session["VerifyChar"] = VerifyChar; //将验证字符写入Session,供前台调用;

        //扭曲验证字符。TwistImage参数可自行修改
       float  Twist1,  Twist2;
        if ( S3d > 0.9 )
        {  //3D背景减少扭曲
            Twist1 = 0;
            Twist2 = 0;
        }
        else
        {
            Twist1 =Convert.ToInt32(new Random().NextDouble()) * 3 ; //扭曲参数随机生成;
            Twist2 = Convert.ToInt32(new Random().NextDouble()) * 2; //扭曲参数随机生成;
        }
        Img = TwistImage(Img, true, -Twist1, -Twist2);
        Img = TwistImage(Img, false, Twist1, Twist2); //多扭曲几次也没关系,只是消耗服务器资源多些;

        ms = new MemoryStream();
        Img.Save(ms, ImageFormat.Png);
       
       // Response.ClearContent() ;//需要输出图象信息 要修改HTTP头 ;
       // Response.ContentType = "image/Png";
       // Response.BinaryWrite(ms.ToArray());
        //g.Dispose();
       // Img.Dispose();
       
       // Response.End();
    }
   
    //函数名称:RndChar
    //函数参数:VcodeNum--设定返回随机字符串的位数
    //函数功能:产生指定长度的由数字和字符组成的随机字符串
    private string  RndChar(int  VcodeNum)
    {
           string  Vchar = "3,3,5,5,6,6,7,7,9,9,A,C,E,F,G,H,K,L,M,N,P,R,T,X,Y,Z" ;//定义验证码字符及出现频次;
        string [] VcArray= Vchar.Split(',');//将字符串生成数组 ;
        Vchar = "";
         byte i;
         for (i = 0; i <= Convert.ToInt32(VcodeNum * Convert.ToInt32(new Random().NextDouble())) + 1; i++)
        {//确保最少2个字符,最多VcodeNum+1个字符
           // Randomize();
            Vchar = Vchar + VcArray[Convert.ToInt32(25 * Convert.ToInt32(new Random().NextDouble()))];//数组一般从0开始读取,所以这里为25*Rnd ;
        } //
        return Vchar;
    }
        //函数名称:TwistImage
    //函数参数: dMultValue-波形的幅度倍数;dPhase波形的起始相位,取值区间[0-2*PI);bXDir-扭曲方式
    //函数功能:正弦曲线Wave扭曲图片。函数可以迭加使用,以获得不同方式不同程度的效果
    //这个天才的函数,已经无法考证出处了。感谢原作者!
 public Bitmap TwistImage( Bitmap srcBmp,  bool bXDir,  double dMultValue,  double dPhase )
 {

        Bitmap  destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
        double dBaseAxisLen = bXDir?Double.Parse(destBmp.Height.ToString()):Double.Parse(destBmp.Width.ToString());
         int i;
        for ( i = 0 ; i <= destBmp.Width - 1;i++)
        {
             int j;
            for ( j = 0 ; j <= destBmp.Height - 1;j++)
            {
                 double dx = 0;
                dx = bXDir? PI2 * Double.Parse(j.ToString()) / dBaseAxisLen: PI2 * Double.Parse(i.ToString()) / dBaseAxisLen;
                dx += dPhase;
                 double dy = Math.Sin(dx);

                // 取得当前点的颜色
                 int nOldX = 0;
                 int nOldY = 0;
                nOldX =bXDir? i + Convert.ToInt32(dy * dMultValue): i ;//ToDo: Unsupported feature: conditional (?) operator.;
                nOldY =bXDir? j: j + Convert.ToInt32(dy * dMultValue);//ToDo: Unsupported feature: conditional (?) operator.;

                 System.Drawing.Color color = srcBmp.GetPixel(i, j);
                if ( nOldX >= 0 && nOldX < destBmp.Width && nOldY >= 0 && nOldY < destBmp.Height )
                {
                    destBmp.SetPixel(nOldX, nOldY, color);
                }
            }
        }

        return destBmp;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Newxyz_Bbs_User user = new Newxyz_Bbs_User();
        user.User_Name = this.name.Text;
        user.User_Pass = this.pwd.Text;
        user.User_Sex = Convert.ToInt32(this.sex.SelectedValue);
        user.User_Question = this.question.Text;
        user.User_Answer = this.answer.Text;
        user.User_Email = this.email.Text;
        if (!this.qq.Text.Equals(""))
        {
            user.User_QQ = Convert.ToInt32(this.qq.Text);
        }
        Newxyz_Bbs_UserService userMan = new Newxyz_Bbs_UserService();
       ;//首先检验用户名是否已经存在
        Newxyz_Bbs_User  getUser= userMan.getByUserName(user.User_Name);
        if (getUser==null)
        {
            int i = 0;
            i = userMan.addUser(user);
            if (i != 0)
            {
                Session["userName"] = user.User_Name;
                Response.Redirect("regSucess.aspx?");
            }
        }
        else
        {
            this.Label1.Visible = true;
            this.Label1.Text = "此用户名已经存在!";
          
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# ASP.NET 中生成验证码可以通过以下步骤实现: 1. 在 ASPX 页面中添加一个 Image 控件,用于显示验证码图片: ```html <asp:Image ID="imgCaptcha" runat="server" /> ``` 2. 在 ASPX 页面中添加一个 Button 控件,用于刷新验证码: ```html <asp:Button ID="btnRefresh" runat="server" Text="刷新" OnClick="btnRefresh_Click" /> ``` 3. 在 ASPX 页面中添加一个 TextBox 控件,用于用户输入验证码: ```html <asp:TextBox ID="txtCaptcha" runat="server"></asp:TextBox> ``` 4. 在后台代码中生成验证码图片和验证码字符串: ```csharp protected void GenerateCaptcha() { // 生成随机验证码字符串 string captcha = GenerateRandomCode(); // 将验证码字符串存储到 Session 中,用于验证用户输入 Session["Captcha"] = captcha; // 生成验证码图片 Bitmap image = new Bitmap(200, 50); Graphics graphics = Graphics.FromImage(image); Font font = new Font("Arial", 20, FontStyle.Bold); Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); Brush brush = new SolidBrush(Color.FromArgb(255, 0, 0, 0)); graphics.FillRectangle(brush, rect); brush = new SolidBrush(Color.FromArgb(255, 255, 255, 255)); graphics.DrawString(captcha, font, brush, 10, 10); MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Png); // 将验证码图片显示在 Image 控件中 imgCaptcha.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(stream.ToArray()); } ``` 5. 在后台代码中处理刷新按钮的点击事件,重新生成验证码: ```csharp protected void btnRefresh_Click(object sender, EventArgs e) { GenerateCaptcha(); } ``` 6. 在后台代码中处理用户提交表单的事件,比较用户输入的验证码和 Session 中存储的验证码是否一致: ```csharp protected void btnSubmit_Click(object sender, EventArgs e) { string captcha = Session["Captcha"] as string; if (txtCaptcha.Text == captcha) { // 验证码正确,继续处理表单提交 } else { // 验证码错误,提示用户重新输入 } } ``` 注意:为了增加验证码的安全性,应该在生成随机验证码字符串时使用随机数生成器,并且在生成验证码图片时使用随机字体和随机颜色,以防止恶意程序破解验证码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值