RSS
  • 首页
  • 关于

与标签 ‘ASP .Net’ 相关的文章

ASP .Net学习笔记之验证码实现

三月 24, 2010 by admin | 0 Comment »

最新开始学习ASP .Net,因为之前熟悉的是类C的编程语言,所以熟悉起来倒还没太多难度。下面要讲的是Web开发中经常要用到的验证码,先说一说如何用C#来实现它。
我们通常说的验证码,也可以称为CAPTCHA,也就是全自动区分计算机和人类的测试(CAPTCHA, Completely Automated Public Test to tell Computers and Humans Apart),是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。CAPTCHA目前广泛用于网站的留言板,许多留言板为防止有人利用计算机程序大量在留言板上张贴广告或其他垃圾信息,因此会放置CAPTCHA要求留言者必需输入图片上所显示的文数字或是算术题才可完成留言。而一些网络上的交易系统(如订票系统、网络银行)也为避免被计算机程序以暴力法大量尝试交易也会有CAPTCHA的机制。

实现思路:
1.随机生成一个固定长度的字符串,里面可以包含数字、字母甚至汉字都可以,存入一个Session变量中;
2.利用C#的图形相关类来绘制图片,显示在网页上;
3.将用户输入的内容与前面的Session变量进行比对;
下面是Captcha.aspx.cs的内容:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Drawing;
 
namespace WebApplication2
{
    public partial class Captcha : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string verifyCode = GetRandomString(4);
            this.CreateCaptcha(verifyCode);
            Session["verifyCode"] = verifyCode;
        }
 
        ///
        /// 产生一定长度的随机字符串
        ///
        ///
 
        ///
        private string GetRandomString(int length)
        {
            string[] characters = { "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" };
            int charactersLength = characters.Length;
            Random rd = new Random();
            string randomString = "";
            int indexNum = 0;
            for (int i = 0; i < length; i++)
            {
                indexNum = rd.Next(0, charactersLength - 1);    //随机产生索引值
                randomString += characters[indexNum];     //根据索引值取出字符数组中的字符
            }
            return randomString;
        }
 
        ///
        /// 生成图片
        ///
        ///
 
        private void CreateCaptcha(string checkCode)
        {
            if (checkCode == null || checkCode.Trim() == String.Empty)
                return;
 
            System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 13.5)), 22);
            Graphics g = Graphics.FromImage(image);
 
            try
            {
                //生成随机生成器
                Random random = new Random();
 
                //清空图片背景色
                g.Clear(Color.White);
 
                //画图片的背景噪音线
                for (int 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.FontStyle.Italic 
 
*/));
                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);
 
                //画图片的前景噪音点
                for (int i = 0; i < 100; i++)
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);
 
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
 
                //画图片的边框线
                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);
                Response.ClearContent();
                Response.ContentType = "image/Gif";
                Response.BinaryWrite(ms.ToArray());
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }
 
    }
}

怎么调用呢?在我们想要显示验证码的地方,通过img标签即可调用:

<img id="CodeImg" src="Captcha.aspx" alt="" />

注意这里的src属性必须填写验证码生成程序所对应的aspx页面地址,可以是相对地址也可以是绝对地址。
如果我们要加以完善,也就是万一遇到验证码显示不清楚的情况下,给用户提供刷新更换验证码的功能,实现起来也很简单:

<a onclick="document.getElementById('CodeImg').src='Captcha.aspx?tmp='+Math.random()" href="#">单击此处刷新验证码</a>

注意:这里的CodeImg对应的是你前面img标签的ID,必须要一致。
加上tmp=’+Math.random()这一参数的作用是避免缓存。

实际效果就是这样:

图1

图1


ASP .Net | Tags: ASP .Net, C#, CAPTCHA, 验证码


IT狂人的博客

  • 声明

    本博文章及相关作品(包括但不限于文字、图片),除特别说明为转载外,均属本人原创,依据《国家知识产权法》、《著作权法》和《信息网络传播权保护条例》,原创知识产权、版权均为本人所有,本人享有著作权,并受法律保护。

    文章欢迎转载,但请事先与本人联系:email
    未经本人许可,任何人不得转载或使用整体或任何部分的内容。未尽事宜,依据相关法律法规处理。

  • 分类目录

    • ASP .Net (1)
    • CodeIgniter (8)
    • PHP (10)
    • Web (7)
    • 未分类 (1)
    • 杂谈 (4)
    • 译文 (7)
    • 音乐&电影 (1)
  • 最近文章

    • Discuz上传图片时出现“无效的图片文件”提示的解决方案
    • discuz定时发帖的另类实现
    • 使用PHP的Glob()函数来遍历文件夹
    • [译]PHP面向对象入门
    • 原来如此
    • 使用htaccess来增强WordPress安全性
    • 归来
    • 因4740G而想起的事
    • 选择Web开发框架时需要考虑的15个重要因素
    • 为NetBeans添加Git支持
  • 文章归档

    • 2010 年 八月 (2)
    • 2010 年 七月 (5)
    • 2010 年 五月 (1)
    • 2010 年 四月 (1)
    • 2010 年 三月 (2)
    • 2010 年 二月 (1)
    • 2010 年 一月 (2)
    • 2009 年 十二月 (1)
    • 2009 年 十月 (2)
    • 2009 年 九月 (3)
    • 2009 年 八月 (10)
  • 标签

    API AVC CakePHP CHM CodeIgniter CURD discuz Django DroidSansFallback eaccelerator footer Framework Fran Healy Git helper IT Kohana MVC MVP MYSQL NetBeans Oasis ORM pChart pdf PHP phpMyAdmin Ruby tcpdf techified time Travis Twitter Web windows Wordpress XML Zend 传记 外链 大写 孔乙己 框架 盗链 过滤
  •  

    2010 九月
    一 二 三 四 五 六 日
    « 八    
     12345
    6789101112
    13141516171819
    20212223242526
    27282930  
  • Playlist


  • 近期评论

    • admin 在 [译文]在NetBeans IDE中增加CodeIgniter代码提示 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
  • 链接

    • cnBeta.COM
    • CodeIgniter 中国
    • Gray && Simple
    • jQuery中文社区
    • Lily Allen
    • Mtime时光网
    • W3School
    • 小众软件
    • 破烂熊乐园
    • 韩寒
Copyright © 2010 IT狂人的博客 All Rights Reserved. XHTML CSS THEME by I SOFTWARE REVIEWS