ASP.NET网页验证码常用方法
验证码生产类
using System;
using System.Data;
using System.Configuration; using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts; using System.Drawing;
using System.IO;
using System.Drawing.Imaging; /// <summary>
/// Summary description for validatedCode
/// </summary>
public class ValidatedCode
{
#region 验证码长度(默认4个验证码的长度)
int length = ;
public int Length
{
get { return length; }
set { length = value; }
}
#endregion #region 验证码字体大小(为了显示扭曲效果,默认40像素,可以自行修改)
int fontSize = ;
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
#endregion #region 边框补(默认1像素)
int padding = ;
public int Padding
{
get { return padding; }
set { padding = value; }
}
#endregion #region 是否输出燥点(默认不输出)
bool chaos = true;
public bool Chaos
{
get { return chaos; }
set { chaos = value; }
}
#endregion #region 输出燥点的颜色(默认灰色)
Color chaosColor = Color.LightGray;
public Color ChaosColor
{
get { return chaosColor; }
set { chaosColor = value; }
}
#endregion #region 自定义背景色(默认白色)
Color backgroundColor = Color.White;
public Color BackgroundColor
{
get { return backgroundColor; }
set { backgroundColor = value; }
}
#endregion #region 自定义随机颜色数组
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
#endregion #region 自定义字体数组
string[] fonts = { "Arial", "Georgia" };
public string[] Fonts
{
get { return fonts; }
set { fonts = value; }
}
#endregion #region 自定义随机码字符串序列(使用逗号分隔)
string codeSerial = "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,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";
public string CodeSerial
{
get { return codeSerial; }
set { codeSerial = value; }
}
#endregion #region 产生波形滤镜效果 private const double PI = 3.1415926535897932384626433832795;
private const double PI2 = 6.283185307179586476925286766559; /// <summary>
/// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
/// </summary>
/// <param name="srcBmp">图片路径</param>
/// <param name="bXDir">如果扭曲则选择为True</param>
/// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
/// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
/// <returns></returns>
public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height); // 将位图背景填充为白色
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), , , destBmp.Width, destBmp.Height);
graph.Dispose(); double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width; for (int i = ; i < destBmp.Width; i++)
{
for (int j = ; j < destBmp.Height; j++)
{
double dx = ;
dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx); // 取得当前点的颜色
int nOldX = , nOldY = ;
nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (int)(dy * dMultValue); System.Drawing.Color color = srcBmp.GetPixel(i, j);
if (nOldX >= && nOldX < destBmp.Width
&& nOldY >= && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
} return destBmp;
} #endregion #region 生成校验码图片
public Bitmap CreateImageCode(string code)
{
int fSize = FontSize;
int fWidth = fSize + Padding; int imageWidth = (int)(code.Length * fWidth) + + Padding * ;
int imageHeight = fSize * + Padding; System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight); Graphics g = Graphics.FromImage(image); g.Clear(BackgroundColor); Random rand = new Random(); //给背景添加随机生成的燥点
if (this.Chaos)
{ Pen pen = new Pen(ChaosColor, );
int c = Length * ; for (int i = ; i < c; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height); g.DrawRectangle(pen, x, y, , );
}
} int left = , top = , top1 = , top2 = ; int n1 = (imageHeight - FontSize - Padding * );
int n2 = n1 / ;
top1 = n2;
top2 = n2 * ; Font f;
Brush b; int cindex, findex; //随机字体和颜色的验证码字符
for (int i = ; i < code.Length; i++)
{
cindex = rand.Next(Colors.Length - );
findex = rand.Next(Fonts.Length - ); f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
b = new System.Drawing.SolidBrush(Colors[cindex]); if (i % == )
{
top = top2;
}
else
{
top = top1;
} left = i * fWidth; g.DrawString(code.Substring(i, ), f, b, left, top);
} //画一个边框 边框颜色为Color.Gainsboro
g.DrawRectangle(new Pen(Color.Gainsboro, ), , , image.Width - , image.Height - );
g.Dispose(); //产生波形(Add By 51aspx.com)
image = TwistImage(image, true, , ); return image;
}
#endregion #region 将创建好的图片输出到页面
public void CreateImageOnPage(string code, HttpContext context)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Bitmap image = this.CreateImageCode(code); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); context.Response.ClearContent();
context.Response.ContentType = "image/Jpeg";
context.Response.BinaryWrite(ms.GetBuffer()); ms.Close();
ms = null;
image.Dispose();
image = null;
}
#endregion #region 生成随机字符码
public string CreateVerifyCode(int codeLen)
{
Random CheckNum = new Random(); string code = ""; for (int i = ; i < codeLen; i++)
{
if(i%==)
code += (Convert.ToChar(CheckNum.Next(, ))).ToString();
else
code += CheckNum.Next(, ).ToString();
} return code;
}
public string CreateVerifyCode()
{
return CreateVerifyCode();
}
#endregion
}
验证码显示页面
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts; using System.Drawing.Drawing2D;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Px_CSLibrary.Public;
public partial class CheckCode : System.Web.UI.Page
{ protected void Page_Load(object sender, EventArgs e)
{
ValidatedCode v = new ValidatedCode();
string checkNum = v.CreateVerifyCode(); //取随机码
Session["Checkcode"] = checkNum;
HttpCookie cookCode = new HttpCookie("Check");
cookCode.Values.Add("code", checkNum);//把随机验证码保存Cookie
cookCode.Expires = DateTime.Now.AddMilliseconds();
Response.Cookies.Add(cookCode); v.CreateImageOnPage(checkNum, this.Context); // 输出图片 } }
页面标签引用
<dd> <img id="CheckCode" alt="验证码" width="85px" height="25px" style="cursor: pointer" src="CheckCode.aspx" onclick="GetCode()" /></dd>
<dd>
<a href="javascript:void(0)" onclick="GetCode();">刷新</a>
</dd>
ASP.NET网页验证码常用方法的更多相关文章
- ASP.NET MVC验证码演示(Ver2)
前一版本<ASP.NET MVC验证码演示>http://www.cnblogs.com/insus/p/3622116.html,Insus.NET还是使用了Generic handle ...
- delphi WebBrowser控件上网页验证码图片识别教程(一)
步骤一:获取网页中验证码图片的url地址 在delphi中加入一个BitBtn和一个memo以及WebBrowser控件实现网页中验证码图片的url地址的获取 程序如下:procedure TForm ...
- 调试asp.net网页时不显示treeview的原因
在.net中本地调试asp.net网页时,treeview控件显示为文字方式,原因是在http://localhost/下面找不到webctrl_client的路径,解决的方法是把webctrl_cl ...
- asp.net应用程序生命周期和asp.net网页的生命周期
一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...
- C#与mysql做ASP.NET网页数据库查询速度测试
两种方法是:1,使用mysql数据库的存储过程:2,C#编码,做网页后台与mysql数据库连接,前台测试显示测试过结果下面我将分别讲解两种方法的具体实现. 1,使用mysql数据库的存储过程插入万条大 ...
- 网页绘制图表 Google Charts with JavaScript #2 ....与ASP.NET网页结合 (ClientScriptManager.RegisterStartupScript 方法)
此为文章备份,原文出处(我的网站) 网页绘制图表 Google Charts with JavaScript #2 ....与ASP.NET网页结合 (ClientScriptManager.Regi ...
- 如何:确定调用 ASP.NET 网页的方式
如何:确定调用 ASP.NET 网页的方式 通常有必要了解调用 ASP.NET 网页的方式:是由原始请求 (HTTP GET).回发 (HTTP POST).来自其他页的跨页面发送 (HTTP POS ...
- 在 ASP.NET 网页中不经过回发而实现客户端回调
一.使用回调函数的好处 在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作.此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器.但是, ...
- ASP.NET网页动态添加、更新或删除数据行
ASP.NET网页动态添加.更新或删除数据行 看过此篇<ASP.NET网页动态添加数据行> http://www.cnblogs.com/insus/p/3247935.html的网友,也 ...
随机推荐
- Java-->多线程复制(文件指针)
--> 这里用到两种方法...其实也不算两种,就一点点不一样而已... ---> Test 测试类 package com.dragon.java.multithreadcopy; imp ...
- 215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 203. Remove Linked List Elements
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- Codeforces Round #303 (Div. 2) B 水 贪心
B. Equidistant String time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Baxter机器人---测试准备(一)
原创博文,转载请标明出处:--周学伟http://www.cnblogs.com/zxouxuewei/ baxter:http://sdk.rethinkrobotics.com/wiki/Work ...
- 渴切-开源中文css框架
渴切:是国内优秀的开源css框架. 渴切是一个开源中文 (X)HTML/CSS 框架 ,它的目的是减少你的css开发时间.它提供一个可靠的css基础去创建你的项目,能够用于网站的快速设计,通过重设和重 ...
- (转) TensorFlow深度学习,一篇文章就够了
TensorFlow深度学习,一篇文章就够了 2016/09/22 · IT技术 · TensorFlow, 深度学习 分享到:6 原文出处: 我爱计算机 (@tobe迪豪 ) 作者: 陈迪 ...
- ARTICLES
https://blogs.msdn.microsoft.com/tess/2005/12/20/things-to-ignore-when-debugging-an-asp-net-hang/ ht ...
- struts2标签整理
在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题, 一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件: Java代码 ...
- C# typeof()实例详解
typeof(C# 参考) 用于获取类型的 System.Type 对象.typeof 表达式采用以下形式: System.Type type = typeof(int); 备注 若要获取表达式的运 ...