asp.net 驗(yàn)證碼生成和刷新及驗(yàn)證
1 新建VerifyCode.aspx
cs文件代碼如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
/**///// <summary>
/// 頁(yè)面驗(yàn)證碼程序
/// 使用:在頁(yè)面中加入HTML代碼 <img src="VerifyCode.aspx">
/// </summary>
public partial class VerifyCode : System.Web.UI.Page
...{
static string[] FontItems = new string[] ...{ "Arial",
"Helvetica",
"Geneva",
"sans-serif",
"Verdana"
};
static Brush[] BrushItems = new Brush[] ...{ Brushes.OliveDrab,
Brushes.ForestGreen,
Brushes.DarkCyan,
Brushes.LightSlateGray,
Brushes.RoyalBlue,
Brushes.SlateBlue,
Brushes.DarkViolet,
Brushes.MediumVioletRed,
Brushes.IndianRed,
Brushes.Firebrick,
Brushes.Chocolate,
Brushes.Peru,
Brushes.Goldenrod
};
static string[] BrushName = new string[] ...{ "OliveDrab",
"ForestGreen",
"DarkCyan",
"LightSlateGray",
"RoyalBlue",
"SlateBlue",
"DarkViolet",
"MediumVioletRed",
"IndianRed",
"Firebrick",
"Chocolate",
"Peru",
"Goldenrod"
};
private static Color BackColor = Color.White;
private static Pen BorderColor = Pens.DarkGray;
private static int Width = 52;
private static int Height = 21;
private Random _random;
private string _code;
private int _brushNameIndex;
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
//InitializeComponent();
//base.OnInit(e);
}
/**//**//**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
...{
//this.Load += new System.EventHandler(this.Page_Load);
}
/**//// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Page_Load(object sender, System.EventArgs e)
...{
if (!IsPostBack)
...{
//
// TODO : initialize
//
this._random = new Random();
this._code = GetRandomCode();
//
// TODO : use Session["code"] save the VerifyCode
//
Session["code"] = this._code;
//
// TODO : output Image
//
this.SetPageNoCache();
this.OnPaint();
}
}
/**//**//**//// <summary>
/// 設(shè)置頁(yè)面不被緩存
/// </summary>
private void SetPageNoCache()
...{
Response.Buffer = true;
Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.AppendHeader("Pragma","No-Cache");
}
/**//**//**//// <summary>
/// 取得一個(gè) 4 位的隨機(jī)碼
/// </summary>
/// <returns></returns>
private string GetRandomCode()
...{
return Guid.NewGuid().ToString().Substring(0, 4);
}
/**//**//**//// <summary>
/// 隨機(jī)取一個(gè)字體
/// </summary>
/// <returns></returns>
private Font GetFont()
...{
int fontIndex = _random.Next(0, FontItems.Length);
FontStyle fontStyle = GetFontStyle(_random.Next(0, 2));
return new Font(FontItems[fontIndex], 12, fontStyle);
}
/**//**//**//// <summary>
/// 取一個(gè)字體的樣式
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
private FontStyle GetFontStyle(int index)
...{
switch (index)
...{
case 0:
return FontStyle.Bold;
case 1:
return FontStyle.Italic;
default:
return FontStyle.Regular;
}
}
/**//**//**//// <summary>
/// 隨機(jī)取一個(gè)筆刷
/// </summary>
/// <returns></returns>
private Brush GetBrush()
...{
int brushIndex = _random.Next(0, BrushItems.Length);
_brushNameIndex = brushIndex;
return BrushItems[brushIndex];
}
/**//**//**//// <summary>
/// 繪畫(huà)事件
/// </summary>
private void OnPaint()
...{
Bitmap objBitmap = null;
Graphics g = null;
try
...{
objBitmap = new Bitmap(Width, Height);
g = Graphics.FromImage(objBitmap);
Paint_Background(g);
Paint_Text(g);
Paint_TextStain(objBitmap);
Paint_Border(g);
objBitmap.Save(Response.OutputStream, ImageFormat.Gif);
Response.ContentType = "image/gif";
}
catch ...{}
finally
...{
if (null != objBitmap)
objBitmap.Dispose();
if (null != g)
g.Dispose();
}
}
/**//**//**//// <summary>
/// 繪畫(huà)背景顏色
/// </summary>
/// <param name="g"></param>
private void Paint_Background(Graphics g)
...{
g.Clear(BackColor);
}
/**//**//**//// <summary>
/// 繪畫(huà)邊框
/// </summary>
/// <param name="g"></param>
private void Paint_Border(Graphics g)
...{
g.DrawRectangle(BorderColor, 0, 0, Width - 1, Height - 1);
}
/**//**//**//// <summary>
/// 繪畫(huà)文字
/// </summary>
/// <param name="g"></param>
private void Paint_Text(Graphics g)
...{
g.DrawString(_code, GetFont(), GetBrush(), 3, 1);
}
/**//**//**//// <summary>
/// 繪畫(huà)文字噪音點(diǎn)
/// </summary>
/// <param name="g"></param>
private void Paint_TextStain(Bitmap b)
...{
for (int n=0; n<30; n++)
...{
int x = _random.Next(Width);
int y = _random.Next(Height);
b.SetPixel(x, y, Color.FromName(BrushName[_brushNameIndex]));
}
}
}
2 頁(yè)面引用:
<asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />
一般需要同時(shí)提供刷新功能(看不清楚換一張),代碼如下
<asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" /> <A href="javascript:getimgcode()">刷新驗(yàn)證碼</A>
如使用了母版頁(yè),則用如下代碼:
<img ID="getcode" alt="" src="VerifyCode.aspx" /> <%--<asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />--%>
<A href="javascript:getimgcode()">刷新驗(yàn)證碼</A>
超鏈接對(duì)應(yīng)的javascript如下:
<script language="javascript" type="text/javascript">
function getimgcode()
{
var getimagecode = document.getElementById("getcode");
getimagecode.src = "VerifyCode.aspx";
}
</script>
3 判斷驗(yàn)證
上述代碼是將驗(yàn)證碼存貯在Session中,用code來(lái)標(biāo)志。讀取代碼Session["code"].ToString();
使用中,我們只需要比較Session["code"].ToString()和文本框輸入的串(TextBoxCode.Text)是否相同即可進(jìn)行判斷。
if(Session["code"].ToString().Trim().Equals(TextBoxCode.Text.Trim()))
...{
Response.Write("Success");
}
測(cè)試通過(guò)!
- ASP.net 驗(yàn)證碼實(shí)現(xiàn)代碼(C#)
- asp.net(C#) 生成隨機(jī)驗(yàn)證碼的代碼
- Asp.net(C#)實(shí)現(xiàn)驗(yàn)證碼功能代碼
- asp.net 簡(jiǎn)單驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼
- ASP.NET MVC驗(yàn)證碼功能實(shí)現(xiàn)代碼
- ASP.NET 實(shí)現(xiàn)驗(yàn)證碼以及刷新驗(yàn)證碼的小例子
- ASP.NET中的無(wú)刷新驗(yàn)證碼的開(kāi)發(fā)(完整代碼)
- asp.net 圖片驗(yàn)證碼的HtmlHelper
- asp.net ajax實(shí)現(xiàn)無(wú)刷新驗(yàn)證碼
- ASP.NET生成驗(yàn)證碼的方法
相關(guān)文章
Visual Studio 2010崩潰重啟問(wèn)題(源文件編譯崩潰)
在使用Visual Studio 2010突然出現(xiàn)崩潰現(xiàn)象:源文件修改只要一編譯,馬上就崩潰.搜索了很多的方法也不見(jiàn)效果,經(jīng)過(guò)近1天的折騰,已經(jīng)決定重裝Windows 7了,遇到此問(wèn)題的朋友們可以看看哦,或許對(duì)你有所幫助2013-01-01JWT + ASP.NET MVC時(shí)間戳防止重放攻擊詳解
這篇文章主要給大家介紹了關(guān)于JWT + ASP.NET MVC時(shí)間戳防止重放攻擊發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07.net下實(shí)現(xiàn)Word動(dòng)態(tài)填加數(shù)據(jù)打印
.net下實(shí)現(xiàn)Word動(dòng)態(tài)填加數(shù)據(jù)打印...2007-04-04.NET Windbg分析某婦產(chǎn)醫(yī)院WPF內(nèi)存溢出
這篇文章主要為大家介紹了.NET Windbg分析某婦產(chǎn)醫(yī)院WPF內(nèi)存溢出,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06.net讓線程支持超時(shí)的方法實(shí)例和線程在執(zhí)行結(jié)束后銷(xiāo)毀的方法
兩個(gè)問(wèn)題:.net如何讓線程支持超時(shí)?.net如何讓線程在執(zhí)行結(jié)束后銷(xiāo)毀?本文就解決這二個(gè)問(wèn)題2013-11-11.Net彈性和瞬態(tài)故障處理庫(kù)Polly實(shí)現(xiàn)執(zhí)行策略
這篇文章介紹了.Net彈性和瞬態(tài)故障處理庫(kù)Polly實(shí)現(xiàn)執(zhí)行策略的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06在C#及.NET框架中使用StringBuilder類(lèi)操作字符串的技巧
StringBuilder類(lèi)在C#中一般被用來(lái)拼接字符串,而依托.NET Framework則可以實(shí)現(xiàn)添加替換移除等靈活的動(dòng)態(tài)字符串操作,以下就來(lái)總結(jié)一下在C#及.NET框架中使用StringBuilder類(lèi)操作字符串的技巧2016-05-05.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮
這篇文章主要給大家介紹了.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮的相關(guān)資料,文中通過(guò)示例代碼與圖片介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02asp.net下URL網(wǎng)址重寫(xiě)成.html格式、RSS、OPML的知識(shí)總結(jié)
asp.net下URL網(wǎng)址重寫(xiě)成.html格式、RSS、OPML的知識(shí)總結(jié)...2007-09-09