亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET 如何做出簡單的驗證碼

2019-11-17 01:39:40
字體:
來源:轉載
供稿:網友

asp.net 如何做出簡單的驗證碼

如果說要做驗證碼,那不得不提的就是GDI+繪圖了。我們都知道驗證碼是以圖片形式展示的,而且是動態生成的,這樣就需要我們去畫出它。

科普一下,什么是GDI+?

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

下面說說驗證碼,對于驗證碼這樣的圖片,我覺得是由兩部分組成的,一部分是矩形的背景,另一部分是在其上的字母數字組合(有的時候有漢字,有的時候是純字母或者純數字,這個沒有統一規定,怎么選擇看你~)。對于矩形的背景我們可以直接把其當成畫布,字母數字組合呢?我們可以利用隨機數去拼出一組新組合。這樣整個過程我們都想好了,下面看下代碼吧:

聲明一下,我寫的這個驗證碼為5個字符長度,由大小寫英文字母+數字隨機組合。

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

生成的效果是這樣的:

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

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

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

是不是看起來更專業一些了呢?如果大家還是覺得不滿意的話,可以看下GDI+的相關內容,通過添加一些噪點的元素,或者刪除線這樣子的東西來達到提高識別難度的目的,我這里就不一一列舉啦。

關于如何畫驗證碼我們說過了,但是還有兩點問題我還是想多說一下。

1、我們實際輸出的是一個二進制的流,如何做到顯示到頁面上與頁面其他元素共存呢?

這里通用的一種方法就是把畫驗證碼的這段代碼放到一個獨立的Web窗體頁中,在另一個需要顯示驗證碼的頁面放一個<img>元素,把其src屬性指向該驗證碼頁的url。比如我寫的一段是這樣

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

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

2、驗證碼主要目的還是用于驗證使用的,所以我們在用戶名,密碼是否合法外,同時也要判斷當前輸入的驗證碼是不是與圖片上的驗證碼一致。

我上面的代碼中并沒有寫這塊,其實只要在隨機生成最終驗證碼之后,把其值存入一個session中去就可以了。然后在判斷用戶名,密碼的同時去比較一下這個session值就OK了。如:

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

3、如何用戶沒有看清此張驗證碼,想換一張如何實現?

可以通過腳本給img元素的src屬性重新賦值url實現,當然,麻煩點的話也可以使用Ajax去實現。大家可以自己試試。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品2019中文字幕神马| 日韩电影中文字幕在线观看| 欧美裸体xxxxx| 91在线观看免费高清完整版在线观看| 国精产品一区一区三区有限在线| 伊人久久综合97精品| 日韩成人黄色av| 欧美激情精品久久久| 国产九九精品视频| 亚洲精品456在线播放狼人| 欧美日韩激情视频8区| 欧美尺度大的性做爰视频| 欧美精品18videosex性欧美| 日韩电影中文字幕在线| 色av中文字幕一区| 国产精品成人观看视频国产奇米| 91亚洲精品久久久久久久久久久久| www.午夜精品| 日韩欧美精品中文字幕| 国产精品日韩在线播放| 精品亚洲夜色av98在线观看| 久久久久久久久亚洲| 国产精品免费一区| 国产美女被下药99| 日韩精品黄色网| 在线亚洲欧美视频| 亚洲欧洲第一视频| 亚洲免费视频一区二区| 在线亚洲男人天堂| 中文字幕日韩综合av| 日韩电影在线观看中文字幕| 国产成人拍精品视频午夜网站| 中文字幕成人精品久久不卡| 日韩人在线观看| 亚洲成人1234| 亚洲精品久久久久久久久| 一个人看的www久久| 精品日本高清在线播放| 国产精品嫩草影院一区二区| 国产一区二区久久精品| 国产精品一二三视频| 欧美激情免费视频| 国产精品第七十二页| 国产成人精品综合久久久| 日韩国产激情在线| 亚洲综合最新在线| 国产成人午夜视频网址| 视频在线一区二区| 亚洲自拍偷拍色片视频| 中文字幕日韩av| 欧美日韩中文在线观看| 欧美亚洲国产精品| 国产精品爽黄69| 欧美成人午夜激情在线| 国产福利成人在线| 欧美成人小视频| 欧美日韩成人黄色| 国产97在线|日韩| 一区二区亚洲欧洲国产日韩| 日韩欧美中文免费| 国产日韩欧美中文| 粉嫩av一区二区三区免费野| 全球成人中文在线| 成人午夜在线观看| 国产精品久久久久久婷婷天堂| 国产aⅴ夜夜欢一区二区三区| 国产欧美 在线欧美| 欧美黄网免费在线观看| 久久亚洲精品网站| 久久精品成人欧美大片| 国产91露脸中文字幕在线| 欧美在线观看网址综合| 日韩欧美国产中文字幕| 日韩精品日韩在线观看| 欧美成人精品h版在线观看| 欧美日韩在线观看视频小说| 欧洲亚洲在线视频| 亚洲精品mp4| 欧美大成色www永久网站婷| 亚洲午夜精品视频| 97在线视频免费观看| 国产美女主播一区| 欧美精品免费看| 一本一本久久a久久精品牛牛影视| 欧美成年人视频| 国语对白做受69| 欧美午夜精品久久久久久人妖| 国产精品久久中文| 亚洲午夜小视频| 国产日韩亚洲欧美| 国产精品极品美女粉嫩高清在线| 欧美最猛性xxxxx免费| 久久精品在线播放| 97婷婷涩涩精品一区| 亚洲性69xxxbbb| 亚洲成人精品视频| 欧美激情一区二区三区在线视频观看| 久久久国产精品免费| 久久综合免费视频影院| 欧美成人激情视频免费观看| 国产精品久久不能| 91视频免费在线| 亚洲视频在线观看免费| 国产一区二区三区日韩欧美| 538国产精品一区二区免费视频| 国产一区二区成人| 成年无码av片在线| 日本不卡免费高清视频| 国产精品久久久久久久美男| 国内精品久久久久影院优| 欧美精品第一页在线播放| 精品国产网站地址| 亚洲欧美日韩一区二区在线| 伦理中文字幕亚洲| 51视频国产精品一区二区| 黄网站色欧美视频| 最近2019年好看中文字幕视频| 亚洲午夜精品久久久久久性色| 国产一区av在线| 日韩精品极品在线观看播放免费视频| 国模私拍一区二区三区| 国产99久久精品一区二区永久免费| 亚洲欧美日韩国产中文专区| 久久国产精品网站| 国产中文字幕日韩| 亚洲在线免费观看| 中文字幕一区电影| 国产91精品视频在线观看| 国产91露脸中文字幕在线| 欧美怡春院一区二区三区| 午夜精品一区二区三区在线视| 国产精品99久久久久久久久久久久| 18一19gay欧美视频网站| 久久久成人的性感天堂| 国产一区二区三区日韩欧美| 欧洲午夜精品久久久| 美女福利视频一区| 欧美另类老女人| 亲爱的老师9免费观看全集电视剧| 亚洲国产成人在线播放| 一区二区三区亚洲| 久久精品成人欧美大片| 日韩中文娱乐网| 国产一区二区成人| 亚洲精品欧美日韩| 最新日韩中文字幕| 国产精品美女无圣光视频| 亚洲男人av在线| 日韩av免费观影| 91免费在线视频网站| 久久久久久有精品国产| 日韩欧美一区二区三区久久| 久久精品国产久精国产思思| 欧美日韩日本国产| 国产精品视频永久免费播放| 国产亚洲xxx| 精品国产91久久久| 欧美国产高跟鞋裸体秀xxxhd| 国产精品十八以下禁看| 日韩极品精品视频免费观看| 亚洲三级av在线| 国产福利成人在线| 亚洲精品免费av| 国产视频综合在线|