91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-30 07:26:12 來源:網絡 閱讀:1511 作者:我不會抽煙 欄目:編程語言

如果說要做驗證碼,那不得不提的就是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 = "p_w_picpath/Gif";
            Response.BinaryWrite(ms.ToArray());//輸出二進制數據流
        }

生成的效果是這樣的:

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

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

        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 = "p_w_picpath/Gif";
            Response.BinaryWrite(ms.ToArray());//輸出二進制數據流
        }

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

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

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

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

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

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

<asp:Image ID="p_w_picpath_validatecode" runat="server" ImageUrl="~/PublicMethod/ValidateCode.aspx" />

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

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

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜州市| 丰顺县| 嘉义县| 邹城市| 江门市| 富裕县| 苏尼特左旗| 南澳县| 长兴县| 加查县| 启东市| 博白县| 馆陶县| 红原县| 松桃| 大田县| 广水市| 邢台市| 荣成市| 拉孜县| 金秀| 科尔| 图木舒克市| 如东县| 凤阳县| 浦城县| 鄂尔多斯市| 靖江市| 民丰县| 合川市| 海宁市| 满城县| 西畴县| 原阳县| 西城区| 革吉县| 阿拉善盟| 绿春县| 开鲁县| 泸州市| 朔州市|