C# 生成好看的验证码

网站登录总是会用到验证码,生成验证码对于C#来说很简单,我用的是一般处理程序来写的验证码。具体代码如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;

namespace UI.ajax
{
/// <summary>
/// code 的摘要说明
/// </summary>
public class code : IHttpHandler
{
/// <summary>
/// 验证码类型(0-字母数字混合,1-数字,2-字母)
/// </summary>
private string validateCodeType = "0";
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.BufferOutput = true;
context.Response.Cache.SetExpires(DateTime.Now.AddMilliseconds(-1));
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.AppendHeader("Pragma", "No-Cache");
string ValidateCode = GenerateCheckCode();
//context.Session["CheckCode"] = ValidateCode;//将字符串保存到Session中,以便需要时进行验证
CreateCheckCodeImage(context, ValidateCode);
}
public void CreateCheckCodeImage(HttpContext context, string checkCode)
{

int randAngle = 40; //随机转动角度
int mapwidth = (int)(checkCode.Length * 18);
Bitmap map = new Bitmap(mapwidth, 24);//创建图片背景
Graphics graph = Graphics.FromImage(map);
graph.Clear(Color.White);//清除画面,填充背景
graph.DrawRectangle(new Pen(Color.LightGray, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框

Random rand = new Random();

//验证码旋转,防止机器识别
char[] chars = checkCode.ToCharArray();//拆散字符串成单字符数组
//文字距中
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.DarkBlue };

//画图片的背景噪音线
for (int i = 0; i < 2; i++)
{
int x1 = rand.Next(10);
int x2 = rand.Next(map.Width - 10, map.Width);
int y1 = rand.Next(map.Height);
int y2 = rand.Next(map.Height);

graph.DrawLine(new Pen(c[rand.Next(7)]), x1, y1, x2, y2);
}

for (int i = 0; i < chars.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);
Font f = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular);//字体样式(参数2为字体大小)
Brush b = new System.Drawing.SolidBrush(c[cindex]);
Point dot = new Point(12, 16);
float angle = rand.Next(-randAngle, randAngle);//转动的度数
graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
graph.RotateTransform(-angle);//转回去
graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置
}
//生成图片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/gif";
context.Response.BinaryWrite(ms.ToArray());
graph.Dispose();
map.Dispose();
}
private string GenerateCheckCode()
{
int number;
char code;
string checkCode = String.Empty;
System.Random random = new Random();
for (int i = 0; i < 4; i++)
{
number = random.Next();
code = (char)(‘0‘ + (char)(number % 10));
if (number % 2 == 0)
code = (char)(‘0‘ + (char)(number % 10));
else
code = (char)(‘A‘ + (char)(number % 26));
//去掉0,O,I,o,i,Z,z
if (code.ToString() == "O" || code.ToString() == "I" || code.ToString() == "o" || code.ToString() == "i" || code.ToString() == "Z" || code.ToString() == "z")
{
i--;
continue;
}
//要求全为数字
if (validateCodeType == "1")
{
if ((int)code < 48 || (int)code > 57)
{
i--;
continue;
}
}
//要求全为字母
if (validateCodeType == "2")
{
if ((int)code > 47 || (int)code < 58)
{
i--;
continue;
}
}
checkCode += code.ToString();
}
return checkCode;
}

public bool IsReusable
{
get
{
return false;
}
}
}
}

具体效果为:

时间: 2024-08-15 17:08:16

C# 生成好看的验证码的相关文章

python随机生成6位数验证码

#随机生成6位数验证码 import randomcode = []for i in range(6):    if i == str(random.randint(1,5)):        code.append(i)    else:       temp =  random.randint(65,90)       code.append(chr(temp)) print ''.join(code) ###扩充random用法,随机生成树,和程序无关 print random.rando

js随机生成4位验证码

方法一: /*随机生成4位验证码*/ /*step1:将所有字母,数字装入一个数组备用*/ var codes=[]; //数字:48-57;unicode编码 for(var i=48;i<57;codes.push(i),i++); /*console.log(codes);*/ //大写字母:65-90;unicode编码 for(var i=60;i<90;codes.push(i),i++); //小写字母:97-122;unicode编码 for(var i=97;i<122

学习笔记:利用GDI+生成简单的验证码图片

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 学习笔记:利用GDI+生成简单的验证码图片 1 /// <summary> 2 /// 单击图片时切换图片 3 /// </summary> 4 /// <param name="sender">&

【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户  (自行开发的个人网站) 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录.论坛恶意灌水等.本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码.数字+字母验证码.中文验证码.算术验证码等等以及其Ajax验证过程. 下载示例源码 PHP生成验证码图片 PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中.PHP生成验证码的大致流程有: 1.产生一张png的图片: 2.为图片设置背景

java实现生成简单图片验证码

原文:java实现生成简单图片验证码 源代码下载地址:http://www.zuidaima.com/share/1550463428840448.htm 项目载图: 该项目要转换为Dynamic web project http://www.zuidaima.com/blog/1618162161323008.htm 另外缺少jar包: http://www.zuidaima.com/jar/search/jstl-1.0.1.htm http://www.zuidaima.com/jar/s

JCaptcha生成计算式验证码

前两天买了张火车票,令人egg碎的验证已经无力吐槽,试了几次都让我开始怀疑我的IQ是不是适合再从事程序猿的这个"神圣的职业"了.今天分享的是一段比较传统而不失实用的验证,验证的意义想必大家都已知晓. 好了,语言总是苍白无力.直入真题来看代码的实现的吧. 操作环境: jboss eap 6.2 tomcat也可以,比较懒直接用的jboss.大家有兴趣也可以试试,支持的服务更多,性能更加稳定些. servlet 麻雀虽小,五脏俱全,做了小例子足以. JCaptcha jcaptcha是一个

随机生成4位验证码,由用户输入并验证是否输入正确,如果输入错误就生成新的验证码让用户重新输入,最多输入5次

1 //四位随机验证码 2 Random ran=new Random(); 3 String str1 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXUZ"; 4 char [] a=new char[4]; 5 for(int i=0;i<4;i++) 6 { 7 a[i]=str1.charAt(ran.nextInt(62)); 8 } 9 10 StringBuilder rzm1= new

使用kaptcha插件生成加法计算验证码

1.从官网https://code.google.com/p/kaptcha/下载kaptcha压缩文件,解压文件后里面有一个war文件,打开Eclipse/MyEclipse将其import进去,然后部署到服务器,在浏览器输入url即可看到kaptcha官方提供的基本demo的运行情况,现在将其改为加法计算验证. 2.首先查看web.xml文件发现用来生成验证码的servlet为KaptchaServlet 3.找到KaptchaServlet.class文件,然后进行反编译. 4.新建一个自

Flask 生成中文图片验证码

因最近要用到验证码,上网搜了下,发现什么验证码感觉都能被攻破,连最近疯传的变态的12306的验证码居然有人一天就攻破了,所以,综合考虑,还是使用汉字: web框架是Flask,然后使用python的Image库生成中文验证码,后续也可加入数字字母啥的. 代码如下: # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') """ __author__="tina&qu