zoukankan      html  css  js  c++  java
  • asp.net 生成验证码问题

    1.添加一个.ashx文件

    <%@ WebHandler Language="C#" class="CheckCode" %>

    using System;
    using System.Web;
    using System.Drawing;

    public class CheckCode : IHttpHandler {

        public void ProcessRequest(HttpContext context)
        {
            string g = GenerateCheckCode();
            CreateCheckCodeImage(g);


        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }


        private string GenerateCheckCode()
        {
            int number;
            char code;
            string checkCode = String.Empty;

            System.Random random = new Random();
     
            for (int i = 0; i < 5; i++)
            {
                number = random.Next();

                if (number % 2 == 0)
                    //生成'0'-'9'字符
                    code = (char)('0' + (char)(number % 10));
                else
                    //生成'A'-'Z'字符
                    code = (char)('A' + (char)(number % 26));

                checkCode += code.ToString();
            }

            HttpContext.Current.Response.Cookies.Add(new HttpCookie("checkcode", checkCode));

            return checkCode;
            //两个字符相加等于=asicc码加
        }


        private void CreateCheckCodeImage(string checkCode)
        {
            if (checkCode == null || checkCode.Trim() == String.Empty)
                return;
            //(int)Math.Ceiling((checkCode.Length * 12.5)),22
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(80, 30);
            Graphics g = Graphics.FromImage(image);

            try
            {
                //生成随机生成器
                Random random = new Random();

                //清空图片背景色
                g.Clear(Color.White);

                //画图片的背景噪音线
                for (int i = 0; i < 5; i++)
                {
                    int x1 = random.Next(image.Width+10);
                    int x2 = random.Next(image.Width+10);
                    int y1 = random.Next(image.Height+10);
                    int y2 = random.Next(image.Height+10);

                    Pen p = new Pen(Color.Gray, 4);
                    g.DrawLine(p, x1, y1, x2, y2);
                }

                Font font = new System.Drawing.Font("Arial", 15, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
                System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, System.Drawing.Color.DarkRed, 1.2f, true);
                g.DrawString(checkCode, font, brush, 5, 5);

                //画图片的前景噪音点
                for (int i = 0; i < 200; i++)
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);

                    image.SetPixel(x, y, System.Drawing.Color.FromArgb(random.Next()));
                }

                //画图片的边框线
                g.DrawRectangle(new System.Drawing.Pen(System.Drawing.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);

                HttpContext.Current.Response.ClearContent();
                HttpContext.Current.Response.ContentType = "image/jpg";
                HttpContext.Current.Response.BinaryWrite(ms.ToArray());
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }
       

    }

    2.在用到验证码的界面添加一个img控件,并且src属性指向.ashx文件

    <img alt="看不清,换一张" src="CheckCode.ashx" onclick="this.src='CheckCode.ashx?abc='+Math.random()" />

    3.提交后先判断验证码是否正确

     //检查验证码是否正确
            if(this.txt_checkcode.Text.ToLower ()!=this.Request.Cookies["checkcode"].Value.ToLower () )
            {
                //写脚本提示
               if( this.ClientScript.IsStartupScriptRegistered ("checkcode")==false)
               {
                   this.ClientScript.RegisterStartupScript(this.GetType (),"checkcode","<script>alert('验证码错误!');</script>");
               }
                return;
            }

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/MyBeN/p/1984902.html
Copyright © 2011-2022 走看看