牛腩视频中里面讲到了一个验证码的小程序,在“善良公社”项目中就用到了,觉得蛮有用的,就特意进行了一下整理。

一、运行的效果图:

二、HTML代码:

  <!--
Document   : ASP.NET用一般处理程序生成验证码
Created on : 2013-12-25
Author     : 张连海
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title></title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><script type="text/javascript">function change() {var imgNode = document.getElementById("vimg");imgNode.src = "WaterMark.ashx?t=" + (new Date()).valueOf();  // 这里加个时间的参数是为了防止浏览器缓存的问题  }</script>
</head>
<body><img src="WaterMark.ashx" id="vimg" alt="" /><input type="button" value="换一张图片" οnclick="change()" />
</body>
</html>

三、一般处理程序用WaterMark.ashx.cs的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Drawing2D;namespace Web.hanldler
{public class WaterMark : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间{public void ProcessRequest(HttpContext context){string checkCode = GenCode(5);  // 产生5位随机字符context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色g.Clear(Color.White);// 画图片的背景噪音线int i;for (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.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);//画图片的前景噪音点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);context.Response.ClearContent();context.Response.ContentType = "image/Gif";context.Response.BinaryWrite(ms.ToArray());}finally{g.Dispose();image.Dispose();}}/// <summary>/// 产生随机字符串/// </summary>/// <param name="num">随机出几个字符</param>/// <returns>随机出的字符串</returns>private string GenCode(int num){string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//"的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";char[] chastr = str.ToCharArray();// string[] source ={ "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", "#", "$", "%", "&", "@" };string code = "";Random rd = new Random();int i;for (i = 0; i < num; i++){//code += source[rd.Next(0, source.Length)];code += str.Substring(rd.Next(0, str.Length), 1);}return code;}public bool IsReusable{get{return false;}}}
}

四、改进:

   当然,为了程序的友好化,我们用到了asp.net的验证控件:RequiredFieldValidator与ValidationSummary,来进行为空处理,前台代码如下:

RequiredFieldValidator(必须字段验证):用于检查是否有输入值。

ValidationSummary(验证总结):总结验证结果

<div class="addcomment"><asp:TextBox ID="txtComment" ValidationGroup ="pinglun" runat="server" TextMode="MultiLine" Text="请在此输入评论内容!" Width="500" Height="250" CssClass="comment_con" οnclick="this.select()"></asp:TextBox><p>验证码:<a name="com"> </a><img id="vimg" src="hanldler/WaterMark.ashx" alt="" οnclick="changeCode()" /><asp:TextBox ID="txtCode" ValidationGroup ="pinglun" CssClass="txtcode" runat="server"></asp:TextBox><asp:RequiredFieldValidator ValidationGroup ="pinglun" ID="RequiredFieldValidator1" runat="server" ControlToValidate ="txtCode" SetFocusOnError="True" Display="Dynamic" ErrorMessage ="请输入验证码" Text="*"></asp:RequiredFieldValidator><asp:Button ID="btnSub" ValidationGroup ="pinglun" runat="server" Text="提交" OnClick="btnSub_Click" /><asp:ValidationSummary ID="ValidationSummary1" ValidationGroup ="pinglun" runat="server" ShowMessageBox="true"  ShowSummary="false" /></p>
</div>

五、最终效果:

至此,功能完成,效果还挺炫吧。但在使用验证控件时出了不少麻烦,后续博客将会详细介绍,敬请期待!

牛腩新闻发布系统之技术篇(二)——生成验证码相关推荐

  1. 牛腩新闻发布系统——后台前台整合技术

    在牛腩新闻发布系统中用到了一些技术我就来总结下 一.鼠标超链接设置 一开始就用到了鼠标超链接的设置.尾部样式的设置,这个东西每个网站都要用到非常长用所以可以写下来积累积累. 举个例子 如图:鼠标没有移 ...

  2. 【牛腩新闻发布系统之handler】

    前言: 敲着牛腩已经有很长时间了,一路走来,没有顺顺利利的!正是因为这样,我才感觉自己有了收获!也正是错误的调试,对牛腩新闻发布系统更加了解了!毕竟,错误的调试是一个经历并成长的过程,今天,主要来总结 ...

  3. 【牛腩新闻发布系统】开发前的准备01

    前言: 牛腩新闻发布系统已经完成了很久了,在完成的过程中,一步步按照视频的步骤在走,中间探索了一下注释部分是怎么出来的.整个学习过程紧凑而且有序,中间也拖沓了两周有开始接着完成,接下来是整个过程中一些 ...

  4. 牛腩新闻发布系统——触发器使用

    触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行.触发器经常 ...

  5. 牛腩新闻发布系统——制作母板页

    以牛腩新闻发布系统为例,复述Web开发母版页制作: 单击右键--新建项--选择母版页.命名--确定. 这个母版页中包含三部分不变的内容:top(图片).Search(搜索).footer(底部版权) ...

  6. 【Dongle】【Web】牛腩新闻发布系统之中篇

    相对于前篇总结来说,中篇来得晚了很多,大概都一个多月过去了由于牛腩视频已经看完,并跟着敲了下来,故而在这里,我就总结一下视频后40讲的大概知识点. 在前期框架搭建好之后,中期也就是针对每个页面设计符合 ...

  7. 牛腩新闻发布系统—如何发布

    [前言] 牛腩项目的学习已经接近尾声了,到了该发布的时候了,当时看完牛腩老师的发布系统,并没有很懂,就想着先往下走,当看了Asp.Net第一集的时候,就突然明白怎么回事了,其实也没有那么难. [内容] ...

  8. 牛腩新闻发布系统(2)使用存储过程查询表

    很多人接触数据库,从数据库表中查记录最早应该是利用SQL语句字符串,这也是我们开始操作数据库表使用的SQL语言,那时也看过存储过程,只是不理解存储过程什么意思,现在也只是简单应用,了解一点点而已. 形 ...

  9. 【牛腩新闻发布系统】系统发布06

    前言: BS系统的发布可以通过VS自带的工具实现,也可以通过windows系统自带的IIS进行发布,我用的第二种方法发布的. 使用的方法: https://blog.csdn.net/j1553341 ...

最新文章

  1. OpenCvSharp 图像像素归一化
  2. 索尼推出全能音乐AI工具:作曲混音编曲都OK!留给人类发挥的空间不多了
  3. 产品 电信nb接口调用_电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程)...
  4. wx:for-item循环数组失败
  5. c++ 多个字符串排序_Python小白干货宝典:sorted()函数:列表元素排序
  6. 概率中比较重要的知识
  7. java数组复制_Java自学-数组 复制数组
  8. Star Schema完全参考手册学习笔记七
  9. vmware windows linux udp通信,windows 下 udp socket
  10. shell脚本解析5----循环语句
  11. CentOS操作系统的22个log日志
  12. 自动化技术、计算机技术核心期刊整理及介绍
  13. spark的三种部署模式
  14. java开发最难的地方是什么_java难在哪里?
  15. Linux unison 效率,Linux中inotify+unison实现数据双向(多向)实时同步
  16. android hook 第三方app_【MiSRC】技术分享-浅谈android hook技术
  17. 流行和声(5)minor7和弦
  18. g2o学习记录(1)安装和运行其下面的unit_test项目
  19. 解决问题:xshell6评估已过期
  20. 数学建模——房屋贷款问题——python实现

热门文章

  1. VC里如何打印word,excel,文本文件
  2. Axure RP 9滚动条制作
  3. java反射什么时候用到_Java 反射最佳实践
  4. Vue粒子特效(vue-particles插件) 粒子星空图
  5. html5 开发的意义目的_HTML5的意义
  6. echarts 平滑曲线图详解
  7. nagios 3.4.1监控window与linux,并实现飞信报警
  8. 到底PS和AI有什么区别 UI设计学习路线是什么
  9. three.js 模型重合相交部分闪烁 Z-Fighting
  10. IIS之FTP服务器