验证码(C#)

wangyu065 2009-05-06 03:00:09
我刚刚下了一个C#验证码的源代码,但是运行不出效果,我把代码贴上来

using System;
using System.Configuration;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public partial class GetValidateCode : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Response.ClearContent();
Response.ContentType = "images/Png";
Response.BinaryWrite(GetVImageStream().ToArray());
}


#region 产生图片内存流
/// <summary>
/// 产生图片内存流
/// </summary>
/// <returns>图片内存流</returns>
private MemoryStream GetVImageStream()
{
MemoryStream ImageMemoryStream = new MemoryStream();
string VCodeString = GetVCode(4);
ConfigurationManager.AppSettings["code"] = VCodeString;
Font VCodeFont = new Font("Arial", 14, FontStyle.Bold);
SolidBrush VCodeBrush = new SolidBrush(Color.SandyBrown);
Pen LinePen = new Pen(Color.Ivory, 1);
Bitmap Tmap = new Bitmap(VCodeString.Length * 19, 24);
Graphics TGrphics;
TGrphics = Graphics.FromImage(Tmap);
TGrphics.Clear(BackGroundColor(200, 50));
//产生干扰线
for (int i = 1; i <= 6; i++)
{
int TmpPosition = i * 4;
Color LineColor = BackGroundColor(100, 155);
LinePen.Color = LineColor;
TGrphics.DrawLine(LinePen, 0, TmpPosition, VCodeString.Length * 19, 0);
LineColor = BackGroundColor(100, 155);
LinePen.Color = LineColor;
TGrphics.DrawLine(LinePen, 0, 24, VCodeString.Length * 19, TmpPosition);
}
//产生干扰线
TGrphics.DrawString(VCodeString, VCodeFont, VCodeBrush, VCodeString.Length, 1);
Tmap.Save(ImageMemoryStream, System.Drawing.Imaging.ImageFormat.Png);
Tmap.Dispose();
TGrphics.Dispose();
return ImageMemoryStream;
}
#endregion

#region 随机返回背景色
/// <summary>
/// 随机返回颜色
/// </summary>
/// <param name="BeginRandomNumber">指定颜色开始的最小值</param>
/// <param name="RandomNumber">指定颜色值波动的范围</param>
/// <returns>随机的Color</returns>
private Color BackGroundColor(int BeginRandomNumber, int RandomNumber)
{
int ColorR = 0;
int ColorG = 0;
int ColorB = 0;
Random TRandom = new Random();
ColorR = BeginRandomNumber + TRandom.Next(RandomNumber);
ColorG = BeginRandomNumber + TRandom.Next(RandomNumber);
ColorB = BeginRandomNumber + TRandom.Next(RandomNumber);
Color ColorBG = Color.FromArgb(ColorR, ColorG, ColorB);
return ColorBG;
}
#endregion

#region 随机产生字符串
/// <summary>
/// 随机产生字符串
/// </summary>
/// <param name="VCodeLength">要产生的随机字符串长度</param>
/// <returns></returns>
public string GetVCode(int VCodeLength)
{
if (VCodeLength <= 0)
{
return "";
}
string VCodeString = "0,1,2,3,4,5,6,7,8,9,a,b,c,e,f,g,h,i,j,k,l,m,n,o,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,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] VCodeStringArray = VCodeString.Split(',');
string ReturnValue = "";
int RandomNumber = 0;
Random TRandom = new Random();
for (int i = 1; i <= VCodeLength; i++)
{
RandomNumber = TRandom.Next(VCodeStringArray.Length);
ReturnValue += VCodeStringArray[RandomNumber];
}
return ReturnValue;
}
#endregion

}

请问我要在load事件里面干些什么验证码才能显示出来啊 ?
...全文
2596 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-09-02
  • 打赏
  • 举报
回复
晕,我不要WEB版本的,我想学习
C# winform 登陆框验证码 版本的
oshic 2011-08-11
  • 打赏
  • 举报
回复
我想问一下为什么要对36取余呢?
Big富 2011-05-06
  • 打赏
  • 举报
回复
哦,原来如此
scm3182419 2011-04-29
  • 打赏
  • 举报
回复
原来如此
Adechen 2009-05-06
  • 打赏
  • 举报
回复
一般都是使用 image,让它指向验证码页,代码楼上的已经给了
中年秃头大叔 2009-05-06
  • 打赏
  • 举报
回复
Session["CheckCode"]
<div>
<script type="text/javascript">
function reloadcode()
{
document.getElementById("randomming").src="randomcreate.aspx?"+Math.random();
}
</script>
请输入验证码:<asp:TextBox ID="txtVal" runat="server"><img src="randomcreate.aspx" align="absmiddle" id="randomming" onclick="javascript:reloadcode()"
style="cursor: hand" alt="点击重获验证码." /> <asp:Button ID="btnCheck" runat="server" Text="判断" onClick="btnCheck_Click"/>
</div>
然后在后台button里面写:
if(this.txtVal.Text.Trim().ToUpper()==Session["CheckCode"].ToString().Trim().ToUpper())
{
//相同时
}
else
{
//不同.
}
上面的代码就可以了。点击重获验证码是为了看不清可以换一个.
feilertx 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jasondct 的回复:]
在一个页面上 建立一个 单元格-- 拖一个图片控件 -- 然后图片的路径 是这个页面。 你的验证码 就显示出来了
[/Quote]

up, 判断验证码即是比对该Session["CheckCode"]
wangyu065 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhanglei_love2008 的回复:]
在另外一个面a.aspx
<div>
<script type="text/javascript">
function reloadcode()
{
document.getElementById("randomming").src="randomcreate.aspx?"+Math.random();
}
</script>
<img src="randomcreate.aspx" align="absmiddle" id="randomming" onclick="javascript:reloadcode()"
style="cursor: hand" alt="点击重获验证码." />
</div>
randomcreate.aspx是验证码页面。
运行a.aspx就可以看出效果了.
[/Quote]
请问如果我要在a.aspx得到验证码产生的数字和字符,和页面上的textbox比较怎么做?
function reloadcode()
{
document.getElementById("randomming").src="randomcreate.aspx?"+Math.random();
}
function chechyanzheng()
{
if TextBox1.text=
}
做到这我不会了
这个方法是button的onclick事件
iloveyoubaby 2009-05-06
  • 打赏
  • 举报
回复
将你的验证码的源代码copy到另外一个xxx。aspx.cs文件中,然后在你的验证页面添加一个<img></img> ,在设定Src属性到xxx.aspx,就可以了
中年秃头大叔 2009-05-06
  • 打赏
  • 举报
回复
在另外一个面a.aspx
<div>
<script type="text/javascript">
function reloadcode()
{
document.getElementById("randomming").src="randomcreate.aspx?"+Math.random();
}
</script>
<img src="randomcreate.aspx" align="absmiddle" id="randomming" onclick="javascript:reloadcode()"
style="cursor: hand" alt="点击重获验证码." />
</div>
randomcreate.aspx是验证码页面。
运行a.aspx就可以看出效果了.
wangan2008 2009-05-06
  • 打赏
  • 举报
回复
创建RandomImage.aspx 直接在后台把下面代码复制过去,然后新建个asp 在里面打入 <img src="RandomImage.aspx">右键预览

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;

public partial class RandomImage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetNoStore();
CreateCheckCodeImage(GenerateCheckCode());
}

private string GenerateCheckCode()
{
//定义验证码长度
int CODELENGTH = 4;
int number;
string RandomCode = string.Empty;
Random r = new Random();
for (int i = 0; i < CODELENGTH; i++)
{
number = r.Next();
//字符从0~9, A~Z中随机产生,对应的ASCII码分别为48~57, 65~90 a-z 97~122
number = number % 36;
if (number < 10)
number += 48;
else
number += 55;
RandomCode += ((char)number).ToString();
}
//在Cookie中保存验证码
Session["CheckCode"] = RandomCode;
Response.Cookies.Add(new HttpCookie("CheckCode", RandomCode));
return RandomCode;
}

private void CreateCheckCodeImage(string checkCode)
{
//若验证码为空,则直接返回
if (checkCode == null || checkCode.Trim() == string.Empty)
return;
//根据验证码的长度确定输出图片的宽度
int iWidth = (int)Math.Ceiling(checkCode.Length * 15m);
int iHeight = 20;
//创建图像
Bitmap image = new Bitmap(iWidth, iHeight);
//从图像获取一个绘图面
Graphics g = Graphics.FromImage(image);

try
{
Random r = new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的背景噪音线10条
for (int i = 0; i < 10; i++)
{
int x1 = r.Next(image.Width);
int x2 = r.Next(image.Width);
int y1 = r.Next(image.Height);
int y2 = r.Next(image.Height);
//用银色画出噪音线
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
//画图片的前景噪音点50个
for (int i = 0; i < 50; i++)
{
int x = r.Next(image.Width);
int y = r.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(r.Next()));
}
//画图片的框线
g.DrawRectangle(new Pen(Color.SaddleBrown), 0, 0, image.Width - 1, image.Height - 1);
//定义绘制文字的字体
Font f = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
//线性渐变画刷
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Purple, 1.2f, true);
g.DrawString(checkCode, f, brush, 2, 2);
//创建内存流用于输出图片
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
//图片格式制定为png
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
//清除缓冲区流中的所有输出
Response.ClearContent();
//输出流的HTTP MIME类型设置为"image/Png"
Response.ContentType = "image/Png";
//输出图片的二进制流
Response.BinaryWrite(ms.ToArray());
}
}
finally
{
//释放Bitmap对象和Graphics对象
g.Dispose();
image.Dispose();
}
}
}

jasondct 2009-05-06
  • 打赏
  • 举报
回复
在一个页面上 建立一个 单元格-- 拖一个图片控件 -- 然后图片的路径 是这个页面。 你的验证码 就显示出来了
cpp2017 2009-05-06
  • 打赏
  • 举报
回复
不加Response.End也是可以的.
中年秃头大叔 2009-05-06
  • 打赏
  • 举报
回复
在另外一个面a.aspx
<asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" />//png.aspx是验证码页面。
运行a.aspx就可以看出效果了.
蓝海D鱼 2009-05-06
  • 打赏
  • 举报
回复
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Response.ClearContent();
Response.ContentType = "images/Png";
Response.BinaryWrite(GetVImageStream().ToArray());
Response.End(); //+++++++++++++++++这个
}

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧