[DefaultProperty("Text")]
[ToolboxData("<{0}:ValidateCode runat=server></{0}:ValidateCode>")]
public class ValidateCode : WebControl
{
/// <summary>
/// 记录随机生成的验证码
/// </summary>
private string _checkCode = string.Empty; /// <summary>
/// 用于记录验证码的位数,初始值为4
/// </summary>
private int _codeLen = ; /// <summary>
/// Bindable:用于设置该属性是否可以绑定数据
/// Category:设置属性显示在“按分类顺序”模式时,分组的类别名称
/// Browsable:是否显示在控件的属性面板中
/// DefaultValue:指定属性的默认值
/// Description:指定属性的说明文字
/// </summary>
[Bindable(true), Category("Appearance"), Browsable(true), DefaultValue(true), Description("此属性用于设置验证码的长度")]
public int CodeLength
{
get
{
return _codeLen;
}
set
{
_codeLen = value;
}
} /// <summary>
/// 生成随机验证码
/// </summary>
/// <returns></returns>
private string GetValidateCode()
{
//创建一个字符数组,用于存储组成验证码的数字和英文字母
char[] s = new char[]{'','','','','','','','','a'
,'b','c','d','e','f','g','h','i','j','k','m','n','p','q'
,'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G'
,'H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W'
,'X','Y','Z'};
string num = "";//创建变量用于记录指定长度的验证码的值
Random r = new Random();//生成随机生成器
//根据用户需要的长度来定义验证码的位数
for (int i = ; i < _codeLen; i++)
{
num += s[r.Next(, s.Length)].ToString();
}
return num;//返回生成的随机验证码的值
} /// <summary>
/// 绘制图形验证码
/// </summary>
/// <param name="checkCode">随机生成的验证码</param>
private void CreateCheckCodeImage(string checkCode)
{
System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 14.5)), );//创建画布,用于绘制验证码
Graphics g = Graphics.FromImage(image);//声明Graphics对象
try
{
Random random = new Random(); //生成随机生成器
g.Clear(Color.White); //清空图片背景色
Font font = new System.Drawing.Font("宋体", , (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));//设置字体
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(, , image.Width, image.Height), Color.Green, Color.Red, 1.2f, true);//设置笔刷
g.DrawString(checkCode, font, brush, , );//将验证码绘制到画布中
for (int i = ; i < ; i++) //画图片的前景噪音点
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
HttpContext.Current.Response.Cookies["code"].Value = checkCode;//将验证码存入cookie中
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), , , image.Width - , image.Height - );
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//将验证码图片存入内存流
Page.Response.Clear();//清除缓冲区流中所有内容输出
Page.Response.ContentType = "image/GIF";//设置输出流类型
Page.Response.BinaryWrite(ms.ToArray());//写入输出流
Page.Response.Flush();//向客户端发送输出流
ms.Close();//释放资源
ms.Dispose();//释放资源
Page.Response.End();
}
catch (Exception ex)
{
throw ex;
}
finally
{
g.Dispose();
image.Dispose();
}
} /// <summary>
/// 控件加载事件
/// </summary>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
try
{
string sn = Page.Request.QueryString["_ImageTag"];//获取页面传递的参数
if (sn != null)//判断参数是否为空,如果不为空时才能生成验证码,并绘制输出到页面
{
_checkCode = GetValidateCode();//生成验证码
CreateCheckCodeImage(_checkCode);//绘制输出到页面
}
else
{
//创建一个JavaScript函数用于生成随机数
string script = @"<script language='JavaScript'>
function getnum()
{
var num=Math.floor(Math.random()*100);
return num;
}
</script>";
//将该方法注册到控件所在的页面中
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "getnum", script);
}
}
catch { }
} protected override void RenderContents(HtmlTextWriter output)
{
string CID = string.Empty;
try
{
if (string.IsNullOrEmpty(_checkCode))//首先判断是否生成了验证码
{
CID = this.UniqueID + "img";//设置页面IMG的ID值
//输出表格到页面
output.Write("<table cellpadding=\"0\" cellspacing=\"0\" >");
output.Write("<tr>");
output.Write("<td>");
output.Write("<img border=\"0\" src=\"{0}\" id=\"{1}\"/>", this.Page.Request.Path + "?_ImageTag=" + DateTime.Now.Second, CID);//输出img图片,并且指定其src地址,因为验证码控件是被输出到当前的页面中,所以接收当前页面地址作为图片的数据源
output.Write("</td>");
output.Write("<td>");
output.Write("<a style=\"cursor:pointer;font-size:small\" onclick=\"document.getElementById('" + CID + "').src=" + "'" + this.Page.Request.Path + "?_ImageTag='" + "+getnum()" + "\"" + ">&nbsp;&nbsp;看不清?</a>");//创建一个连接,单击后无刷新更换验证码
output.Write("</td>");
output.Write("</tr>");
output.Write("</table>");
}
}
catch
{
output.Write("<table cellpadding=\"0\" cellspacing=\"0\" >");
output.Write("<tr>");
output.Write("<td>");
output.Write("</td>");
output.Write("<td>");
//显示“看不清?”链接
output.Write("<a style=\"cursor:pointer;font-size:small\"" + ">&nbsp;&nbsp;看不清?</a>");
output.Write("</td>");
output.Write("</tr>");
output.Write("</table>");
}
} /// <summary>
/// 公共方法用于验证输入的验证码是否正确
/// </summary>
public bool CheckSN(string sn)
{
bool flag = false;
if (HttpContext.Current.Request.Cookies["code"].Value != null)//如果cookie不为空
{
flag = sn.ToLower() == HttpContext.Current.Request.Cookies["code"].Value.ToString().ToLower();//判断记录的cookie与输入的验证码是否一致
}
return flag;
} }

网页登陆校验码C#版代码的更多相关文章

  1. Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  2. Python3.x:获取登录界面校验码图片

    Python3.x:获取登录界面校验码图片 实例代码: # python3 # author lizm # datetime 2018-06-01 18:00:00 # -*- coding: utf ...

  3. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  4. 网页头一定要加的代码段(加注版)一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10

      网页头部常见的一段代码 <!--[if lt IE 7 ]><html class="ie6"><![endif]--> <!--[i ...

  5. 公民身份号码校验码算法(C#版)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...

  7. Java获取字符串的CRC8校验码(由C程序的代码修改为了Java代码)

    CRC8算法请百度,我也不懂,这里只是把自己运行成功的结构贴出来了.方法CRC8_Tab这里没有处理,因为我的程序中没有用到. package com.crc; public class CCRC8_ ...

  8. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  9. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

随机推荐

  1. UVA 11802 All Your Bases Belong to Us

    题意:这个题题意个人觉得蛮难懂的....意思就是求,把十进制下的n!转化成m进制,末位有且仅有k个连续的0.告诉n和k,求满足题意的m有多少个. 1<= k <= 10^15,n < ...

  2. Centos6.x X64 飞信安装

    Centos6.x X64 飞信安装 1,安装飞信依赖包 yum -y install glibc.i686 krb5-libs.i686 libstdc++.i686 zlib.i686 --set ...

  3. Apache Commons 工具集使用简介

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文中用了很多网上现成的东西,我只是做了一个汇总整理. 一.Comm ...

  4. hdoj 1200 To and Fro

    To and Fro Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. servlet中避免405错误的产生

    父类Parent(相当于HttpServlet):service方法,用于处理任务分发,doGet.doPost方法用于报错  关注的是子类Son(servlet)     目的:杜绝错误的产生 方式 ...

  6. MySQL 使用while语句向数据表中批量插入数据

    1.创建一张数据表 mysql> create table test_while ( -> id int primary key) charset = utf8; Query OK, ro ...

  7. kindle

    http://www.mindmap8.com/Kindle_Paperwhite/20130726266.html http://blog.csdn.net/felomeng/article/det ...

  8. hdu2002

    import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...

  9. Linux 确定系统glibc版本

    在shell中,可以直接运行glibc共享库文件获取glibc版本,CentOS下执行: /lib/libc.so. 输出为: GNU C Library stable release version ...

  10. php递归创建目录

    /** * 递归创建目录 * @param [string] $path [创建的目录] * @return [type] [description] */ function mk_Dir($path ...