热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自己动手写一个页面验证码

验证码是为了防止通过程序的方式,自动去填写信息,然后自动发送给Web服务器而欺骗服务器进行注册或登录。由于验证码每次都是随机产生的,所以需要人工识别去输入并验证,从而杜绝有人用软件方式

验证码是为了防止通过程序的方式,自动去填写信息,然后自动发送给Web服务器而欺骗服务器进行注册或登录。由于验证码每次都是随机产生的,所以需要人工识别去输入并验证,从而杜绝有人用软件方式自动大量注册ID,从而非法发布广告;或者用于防止对密码的暴力破解。下面教你自己动手写一个验证码。

1. 在你的网站目录下添加一个验证码生成文件:ValidateCode.aspx。

2. 删除该页面所有自动生成的HTML代码,只留下第一行 的页面声明:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ValidateCode.aspx.cs" Inherits="Default2" %>

3. 在页面ValidateCode.aspx.cs中添加验证码的图像生成代码(添加System.Drawing的引用)

//页面启动时,生成验证码图片

protected void Page_Load(object sender, EventArgs e)
    {
        string CheckCode = GetRandomCode(4);  //得到随机字符串作为验证码
        Session["CheckCode"] = CheckCode;   //保存验证码变量到Session
        SetPageNoCache();  //禁止页面缓存
        CreateImage(CheckCode);  //创建图片
    } 
    //得到随机字符串
    public string GetRandomCode(int CodeCount)
    {
        string allChar = "A, B, C, D, E,,F, G, H, I, J, A, B, C, D, E, F, G, H, i, J, K, M, N, P, Q, R, S, T, U, W, X, Y, Z";
        string[] allCharArray = allChar.Split( ',');
        string RandomCode = "";
        int temp = -1;
        Random rand = new Random();
        for (int i = 0; i         {
            if (temp != -1)
            {
                rand = new Random(temp * i * ((int)DateTime.Now.Ticks));
            }
            int t = rand.Next(33);
            while (temp == t)
            {
                t = rand.Next(33);
            }
            temp = t;
            RandomCode += allCharArray[t];
        }
        return RandomCode;
    }
    //为了保证每次显示的生成的图片和内存中实际的验证码一致,要禁止页面缓存
    private void SetPageNoCache()
    {
        Response.Buffer = true;
        Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
        Response.Expires = 0;
        Response.CacheCOntrol= "no-cache";
        Response.AppendHeader("Pragma", "No-Cache");
    }
    //根据得到的随机字符串生成图像
    private void CreateImage(string checkCode)
    {
        int iwidth = (int)(checkCode.Length * 14);
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 19);
        Graphics g = Graphics.FromImage(image);
        Font f = new Font("Arial", 10);
        Brush b = new System.Drawing.SolidBrush(Color.Black);
        Brush r = new System.Drawing.SolidBrush(Color.FromArgb(166, 8, 8));
        g.Clear(System.Drawing.ColorTranslator.FromHtml("#E5F5FB"));  //背景色
        char[] ch = checkCode.ToCharArray();
        for (int i = 0; i         {
            if (ch[i] >= '0' && ch[i] <= '9')
            {
                //数字用红色显示
                g.DrawString(ch[i].ToString(), f, r, 3 + (i * 12), 3);
            }
            else
            {
                //字母用黑色显示
                g.DrawString(ch[i].ToString(), f, b, 3 + (i * 12), 3);
            }
        }
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        Response.Cache.SetNoStore();
        Response.ClearContent();
        Response.COntentType= "image/Jpeg";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        image.Dispose();
    }

4. 调用验证码

当调用验证码时,在使用验证码的页面加入以下代码:



        ImageUrl="ValidateCode.aspx?GUID=GUID" ToolTip="看不清,换一个" />

在Label的onclick事件里面用脚本实现变换验证码:

   

5. 在后台代码中验证用户输入的验证码是否正确

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.ViewState["GUID"] = System.Guid.NewGuid().ToString();
            this.lblGUID.Text = this.ViewState["GUID"].ToString();
        }
    }

protected void  Button1_Click(object sender, EventArgs e)
{
    if ((Session["CheckCode"] != null) && (Session["CheckCode"].ToString() != ""))
    {
        if (Session["CheckCode"].ToString().ToLower() != this.CheckCode.Text.ToString().ToLower())
        {
            Session["CheckCode"] = null;
            CheckCode.Text = "";
            Response.Write("你填写的验证码错误");
            return ;
        }
        else
        {
            Session["CheckCode"] = null;
        }
    }
    else
    {
        Response.Redirect("default.aspx");
    }
    //验证登录的其他代码  
}


推荐阅读
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
author-avatar
那lady对我说12067358
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有