佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 如何使用ASP.NET制作簡單的驗證碼

如何使用ASP.NET制作簡單的驗證碼

熱門標(biāo)簽:集中運(yùn)營管理辦法 地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 阿里云 硅谷的囚徒呼叫中心 服務(wù)器配置 科大訊飛語音識別系統(tǒng) 百度競價排名

大家都知道驗證碼是以圖片形式展示的,而且是動態(tài)生成的,這樣就需要我們?nèi)ギ嫵鏊?,那不得不提到是GDI+繪圖了

科普一下,什么是GDI+?

GDI+是圖形設(shè)備接口(GDI)的高級版本, 提供了各種豐富的圖形圖像處理功能。GDI+主要由二維矢量圖形、圖像處理和版式3部分組成。GDI+為使用各種字體、字號和樣式來顯示文本這種復(fù)雜任務(wù)提供了大量的支持。

下面說說驗證碼,對于驗證碼這樣的圖片,我覺得是由兩部分組成的,一部分是矩形的背景,另一部分是在其上的字母數(shù)字組合(有的時候有漢字,有的時候是純字母或者純數(shù)字,這個沒有統(tǒng)一規(guī)定,怎么選擇看你~)。對于矩形的背景我們可以直接把其當(dāng)成畫布,字母數(shù)字組合呢?我們可以利用隨機(jī)數(shù)去拼出一組新組合。這樣整個過程我們都想好了,下面看下代碼吧:
聲明一下,我寫的這個驗證碼為5個字符長度,由大小寫英文字母+數(shù)字隨機(jī)組合。

private readonly char[] constant = { 
  '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'};//一個由數(shù)字和大小寫英文字母組成的字符數(shù)組
 
  protected void Page_Load(object sender, EventArgs e)
  {
   Bitmap bitmap = new Bitmap(100, 25);//創(chuàng)建一個位圖,寬100,高25,就是我所說的第一部分,矩形背景
   Graphics g = Graphics.FromImage(bitmap);//創(chuàng)建畫布
   g.Clear(Color.YellowGreen);//為畫布填充黃綠色
 
   Font font1 = new Font("Arial", 15);//設(shè)置字體類型和大小 
   Brush brush = new SolidBrush(Color.Blue);//設(shè)置畫刷顏色
   Pen myPen = new Pen(Color.Blue, 5);//創(chuàng)建畫筆對象
 
   StringBuilder random = new StringBuilder(5); //創(chuàng)建可變字符串對象,用于存放隨機(jī)生成的驗證碼
   Random rd = new Random();//創(chuàng)建一個隨機(jī)數(shù)生成器對象
   for (int i = 0; i  random.Capacity; i++)
   {
   random.Append(constant[rd.Next(62)]);//生成一個隨機(jī)字符加到random里
   }
 
   g.DrawString(random.ToString(), font1, brush, 10, 5);//在畫布上畫出字符串
 
   System.IO.MemoryStream ms = new System.IO.MemoryStream();//創(chuàng)建數(shù)據(jù)流MemoryStream
   bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//指定圖像的輸出格式為gif
 
   Response.ClearContent();
   Response.ContentType = "image/Gif";
   Response.BinaryWrite(ms.ToArray());//輸出二進(jìn)制數(shù)據(jù)流
  }

生成的效果是這樣的:

大家可能會覺得這樣看起來很容易辨識,跟我們平時登錄網(wǎng)站時輸入的驗證碼比起來有點像個小學(xué)生。當(dāng)然,我們可以做些改變,比較加上一定的角度。

private readonly char[] constant = { 
  '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'};//一個由數(shù)字和大小寫英文字母組成的字符數(shù)組
 
  protected void Page_Load(object sender, EventArgs e)
  {
   Bitmap bitmap = new Bitmap(100, 25);//創(chuàng)建一個位圖,寬100,高25,就是我所說的第一部分,矩形背景
   Graphics g = Graphics.FromImage(bitmap);//創(chuàng)建畫布
   g.Clear(Color.YellowGreen);//為畫布填充黃綠色
 
   Font font1 = new Font("Arial", 15);//設(shè)置字體類型和大小 
   float angle = 60;//旋轉(zhuǎn)的一個基礎(chǔ)角度
   float length = 0;//顯示字符的基礎(chǔ)位置,往后看
   Brush brush = new SolidBrush(Color.Blue);//設(shè)置畫刷顏色
   Pen myPen = new Pen(Color.Blue, 5);//創(chuàng)建畫筆對象
 
   StringBuilder random = new StringBuilder(5); //創(chuàng)建可變字符串對象,用于存放隨機(jī)生成的驗證碼
   Random rd = new Random();//創(chuàng)建一個隨機(jī)數(shù)生成器對象
   for (int i = 0; i  random.Capacity; i++)
   {
    random.Append(constant[rd.Next(62)]);//生成一個隨機(jī)字符加到random里
 
    g.ResetTransform();//將畫布重置矩陣
    SizeF size = g.MeasureString(random[random.Length - 1].ToString(), font1);//得到新生成字符的尺寸
    g.TranslateTransform(length + size.Width / 2, size.Height / 2);//選擇此次旋轉(zhuǎn)的中心位置
    g.RotateTransform((float)rd.NextDouble() * angle * 2 - angle);//進(jìn)行隨機(jī)角度旋轉(zhuǎn)
    g.DrawString(random[random.Length - 1].ToString(), font1, brush, new PointF(-size.Width / 2, -size.Height / 2));//注意,這里不是前一個例子,一次性把5個字符全部畫出來,而是一個一個畫
    length += size.Width;//保證下次畫字符的位置不會覆蓋前一次的字符
   }
 
   System.IO.MemoryStream ms = new System.IO.MemoryStream();//創(chuàng)建數(shù)據(jù)流MemoryStream
   bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//指定圖像的輸出格式為gif
 
   Response.ClearContent();
   Response.ContentType = "image/Gif";
   Response.BinaryWrite(ms.ToArray());//輸出二進(jìn)制數(shù)據(jù)流
  }

這時生成的效果是這樣的:

是不是看起來更專業(yè)一些了呢?如果大家還是覺得不滿意的話,可以看下GDI+的相關(guān)內(nèi)容,通過添加一些噪點的元素,或者刪除線這樣子的東西來達(dá)到提高識別難度的目的,我這里就不一一列舉啦。
關(guān)于如何畫驗證碼我們說過了,但是還有兩點問題我還是想多說一下。
1、我們實際輸出的是一個二進(jìn)制的流,如何做到顯示到頁面上與頁面其他元素共存呢?
這里通用的一種方法就是把畫驗證碼的這段代碼放到一個獨立的Web窗體頁中,在另一個需要顯示驗證碼的頁面放一個img>元素,把其src屬性指向該驗證碼頁的url。比如我寫的一段是這樣:

復(fù)制代碼 代碼如下:

asp:Image ID="image_validatecode" runat="server" ImageUrl="~/PublicMethod/ValidateCode.aspx" style="padding-left:3px"/>

其實這里我是用大家通用的方法,不過我先前也有單獨寫一個web自定義控件,專門生成驗證碼使用,但是當(dāng)拖入到頁面中后運(yùn)行,它還是會把頁面其他元素給覆蓋掉,具體原因我也不清楚。

2、驗證碼主要目的還是用于驗證使用的,所以我們在用戶名,密碼是否合法外,同時也要判斷當(dāng)前輸入的驗證碼是不是與圖片上的驗證碼一致。
我上面的代碼中并沒有寫這塊,其實只要在隨機(jī)生成最終驗證碼之后,把其值存入一個session中去就可以了。然后在判斷用戶名,密碼的同時去比較一下這個session值就OK了。如:

復(fù)制代碼 代碼如下:

Session["login_validate_code"] = random.ToString();

3、如何用戶沒有看清此張驗證碼,想換一張如何實現(xiàn)?
可以通過腳本給img元素的src屬性重新賦值url實現(xiàn),當(dāng)然,麻煩點的話也可以使用ajax去實現(xiàn)。大家可以自己試試。

以上就是本文給大家分享的制作驗證碼的全部過程,希望大家能夠喜歡。

您可能感興趣的文章:
  • ASP.NET驗證碼實現(xiàn)(附源碼)
  • asp.net驗證碼的簡單制作
  • ASP.NET驗證碼(3種)
  • asp.net之生成驗證碼的方法集錦(一)
  • asp.net驗證碼圖片生成示例
  • ASP.NET MVC驗證碼功能實現(xiàn)代碼
  • asp.net生成驗證碼(純數(shù)字)
  • asp.net ajax實現(xiàn)無刷新驗證碼
  • 封裝的一個asp.net驗證碼類
  • ASP.NET中的無刷新驗證碼的開發(fā)(完整代碼)
  • asp.net簡單生成驗證碼的方法

標(biāo)簽:西雙版納 甘孜 威海 烏蘭察布 廣西 隨州 開封 梧州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何使用ASP.NET制作簡單的驗證碼》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    宁明县| 灵璧县| 七台河市| 桂阳县| 潞西市| 孝昌县| 长垣县| 旌德县| 林西县| 阿图什市| 来凤县| 藁城市| 湟中县| 康马县| 防城港市| 奉新县| 天峻县| 安阳县| 吉隆县| 临江市| 邹城市| 郁南县| 隆子县| 鸡泽县| 平舆县| 蕲春县| 方城县| 阳春市| 当阳市| 嘉荫县| 库伦旗| 牙克石市| 高清| 和平区| 东源县| 当涂县| 静安区| 新津县| 鄂伦春自治旗| 东台市| 麻城市|