0

0

asp.net 验证码的简单制作(vb.net+C#)

高洛峰

高洛峰

发布时间:2017-01-13 14:40:01

|

1656人浏览过

|

来源于php中文网

原创

网站上验证码效果一般制作方法是: 
1)使用httphandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的outputstream中。 
2)页面中使用异步方式(js等)进行刷新当前页面的验证码。 
【示例】 
1)创建一个“一般应用处理程序ashx”,代码如下: 
[c#] 

public class ValidationCode : IHttpHandler 
{ 
//随机发生器 
static Random r = new Random(Guid.NewGuid().GetHashCode()); 
//排除黑色、透明色颜色,因为底色黑色 
static PropertyInfo[] colors = (typeof(Brushes).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black" && p.Name != "Transparent").Select(p => p).ToArray(); 
//排除黑色颜色,因为底色黑色 
static PropertyInfo[] linecolors = (typeof(Pens).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black").Select(p => p).ToArray(); 
//获取静态类Brushes实例对象 
static object colorobj = typeof(Brushes).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null); 
//获取静态类Pens实例对象 
static object penobj = typeof(Pens).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null); 
//每个随机字符的宽度 
const float PERNUMBERWIDTH = 40.0f; 
//每个字符的高度 
const float PERNUMBERHEIGHT = 50.0f; 
public void ProcessRequest(HttpContext context) 
{ 
//获取要产生多少随机数(默认产生5个) 
int reqNum = 5; 
if (context.Request.QueryString["reqNum"] != null) 
{ 
int.TryParse(context.Request.QueryString["reqNum"], out reqNum); 
} 
//产生多少大的背景图 
Bitmap bt = new Bitmap((int)(PERNUMBERWIDTH*reqNum), (int)PERNUMBERHEIGHT); 
Graphics g = Graphics.FromImage(bt); 
//产生4个随机数(number可以被保存到Session中) 
string numbers = ""; 
//绘制数字 
for (int i = 1; i <= reqNum; i++) 
{ 
numbers += r.Next(0, 9).ToString(); 
var color = (PropertyInfo)colors.GetValue(r.Next(0, colors.Length)); 
context.Response.Write(color.Name + "
"); Brush randomcolor = (Brush)color.GetValue(colorobj, null); g.DrawString(numbers[i-1].ToString(), new Font("黑体", PERNUMBERWIDTH),randomcolor, new PointF((i-1)*PERNUMBERWIDTH, 0f)); } //绘制随机线条 int linenum = r.Next(10, 21); for (int i = 1; i <= linenum; i++) { var linecolor = (PropertyInfo)linecolors.GetValue(r.Next(0, colors.Length)); Pen randomcolor = (Pen)linecolor.GetValue(penobj, null); g.DrawLine(randomcolor, new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT)), new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT))); } g.Dispose(); context.Response.Clear(); context.Response.ContentType = "image/jpeg"; bt.Save(context.Response.OutputStream, ImageFormat.Jpeg); bt.Dispose(); context.Response.End(); } public bool IsReusable { get { return false; } } }

[VB.NET] 

Public Class ValidationCode 
Implements IHttpHandler 
'随机发生器 
Shared r As New Random(Guid.NewGuid().GetHashCode()) 
'排除黑色、透明色颜色,因为底色黑色 
Shared colors As PropertyInfo() = (GetType(Brushes).GetProperties(System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.GetProperty Or System.Reflection.BindingFlags.[Static])).Where(Function(p) p.Name <> "Black" AndAlso p.Name <> "Transparent").[Select](Function(p) p).ToArray() 
'排除黑色颜色,因为底色黑色 
Shared linecolors As PropertyInfo() = (GetType(Pens).GetProperties(System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.GetProperty Or System.Reflection.BindingFlags.[Static])).Where(Function(p) p.Name <> "Black").[Select](Function(p) p).ToArray() 
'获取静态类Brushes实例对象 
Shared colorobj As Object = GetType(Brushes).GetConstructor(BindingFlags.NonPublic, Nothing, Type.EmptyTypes, Nothing) 
'获取静态类Pens实例对象 
Shared penobj As Object = GetType(Pens).GetConstructor(BindingFlags.NonPublic, Nothing, Type.EmptyTypes, Nothing) 
'每个随机字符的宽度 
Const PERNUMBERWIDTH As Single = 40F 
'每个字符的高度 
Const PERNUMBERHEIGHT As Single = 50F 
Public Sub ProcessRequest(context As HttpContext) 
'获取要产生多少随机数(默认产生5个) 
Dim reqNum As Integer = 5 
If context.Request.QueryString("reqNum") IsNot Nothing Then 
Integer.TryParse(context.Request.QueryString("reqNum"), reqNum) 
End If 
'产生多少大的背景图 
Dim bt As New Bitmap(CInt(Math.Truncate(PERNUMBERWIDTH * reqNum)), CInt(Math.Truncate(PERNUMBERHEIGHT))) 
Dim g As Graphics = Graphics.FromImage(bt) 
'产生4个随机数(number可以被保存到Session中) 
Dim numbers As String = "" 
'绘制数字 
For i As Integer = 1 To reqNum 
numbers += r.[Next](0, 9).ToString() 
Dim color = DirectCast(colors.GetValue(r.[Next](0, colors.Length)), PropertyInfo) 
context.Response.Write(Convert.ToString(color.Name) & "
") Dim randomcolor As Brush = DirectCast(color.GetValue(colorobj, Nothing), Brush) g.DrawString(numbers(i - 1).ToString(), New Font("黑体", PERNUMBERWIDTH), randomcolor, New PointF((i - 1) * PERNUMBERWIDTH, 0F)) Next '绘制随机线条 Dim linenum As Integer = r.[Next](10, 21) For i As Integer = 1 To linenum Dim linecolor = DirectCast(linecolors.GetValue(r.[Next](0, colors.Length)), PropertyInfo) Dim randomcolor As Pen = DirectCast(linecolor.GetValue(penobj, Nothing), Pen) g.DrawLine(randomcolor, New PointF(CSng(r.NextDouble() * PERNUMBERWIDTH * reqNum), CSng(r.NextDouble() * PERNUMBERHEIGHT)), New PointF(CSng(r.NextDouble() * PERNUMBERWIDTH * reqNum), CSng(r.NextDouble() * PERNUMBERHEIGHT))) Next g.Dispose() context.Response.Clear() context.Response.ContentType = "image/jpeg" bt.Save(context.Response.OutputStream, ImageFormat.Jpeg) bt.Dispose() context.Response.[End]() End Sub Public ReadOnly Property IsReusable() As Boolean Get Return False End Get End Property End Class

注意: 
1)一些诸如Brushes等特定因为是公用的,需要通过反射获取全部的颜色属性列表,因此使用了静态变量,这样不必每次都初始化,节省内存和时间。 
2)Brushes避免黑色和透明色(本示例背景色是黑色),Pens只需避免黑色即可。有关Brushes颜色,可以查阅:http://msdn.microsoft.com/zh-cn/library/system.windows.media.brush(v=vs.95).aspx 
3)Bitmap类是用于绘制使用的,一般是空白的黑色背景。一般配合Image类+Graphics画布使用,进行绘制。 
4)BitMap的Save方法有若干个重载版本,其中之一可以指定输出流以及设置图片格式。本示例就是使用了这个函数。 
【应用】 

asp.net 验证码的简单制作(vb.net+C#)

Html中代码(验证码部分,局部): 

版纳武林DIY企业建站系统
版纳武林DIY企业建站系统

系统简介1:安全可靠: 在微软主推的.NET开发平台上,采用业界领先的ASP.NET技术和C#语言开发,不仅安全可靠,并能保证系统的高性能运行。2:简单易用:版纳武林DIY企业建站系统真正做到以人为本、以用户体验为中心,能使您快速搭建您的网站。后台管理操作简单,一目了然,没有夹杂多余的功能和广告。3:布局易改:版纳武林DIY企业建站系统采用的是博客形式的风格管理,让您真正感受到我的地盘听我的.4:

下载

验证码

asp.net 验证码的简单制作(vb.net+C#)

注意,之所以使用js设置img的src两次,是因为重复的路径不会引发请求。

更多asp.net 验证码的简单制作(vb.net+C#)相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号