圖形驗證碼的生成(數字和英文大小寫)和提交驗證

来源:http://www.cnblogs.com/tec-1988/archive/2016/10/10/5947347.html
-Advertisement-
Play Games

最初接觸時,感覺很好玩,然後就自己研究了下,做了個demo,然後整理下,下次可以直接使用啦,英文大小寫,點擊可以切換 上代碼了。。。。 頁面代碼: <img id="Img" src="/Login/GetCheckCode" /> 這個是頁面JQuery點擊更換方法 $("#Img").click ...


最初接觸時,感覺很好玩,然後就自己研究了下,做了個demo,然後整理下,下次可以直接使用啦,英文大小寫,點擊可以切換

上代碼了。。。。

頁面代碼:

  <img id="Img" src="/Login/GetCheckCode" />

  這個是頁面JQuery點擊更換方法

  $("#Img").click(function () {
    //this.src = "/Login/GetCheckCode?time="+(new Date()).getTime();   //這個也可以的

    //$("#Img").attr("src", "/Login/GetCheckCode?"+Math.random());

    $("#Img").attr("src", "/Login/GetCheckCode?time=" + (new Date()).getTime());

    註意:src後面加個time的時間參數,是為了再次載入驗證碼,否則載入不了。

    網上的解釋:伺服器端編寫好生成驗證碼的方法,由於客戶端瀏覽器會緩存URL相同的資源,可以使用隨機數/或者時間來重新請求:
  });

後臺代碼:

    public ActionResult GetCheckCode()
    {
      string code = GenerateCheckCodes(4);
      Session["ValidateCode"] = code;
      byte[] bytes = CreateCheckCodeImage(code);
      return File(bytes, @"image/jpeg");
    }

    private string GenerateCheckCodes(int iCount)
    {
      char[] oCharacter = {'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'
              };
      //int number;
      string checkCode = String.Empty;
      int iSeed = DateTime.Now.Millisecond;
      System.Random random = new Random(iSeed);
      for (int i = 0; i < iCount; i++)
      {
        checkCode += oCharacter[random.Next(oCharacter.Length)];

        //純數字
        //number = random.Next(10);
        //number = oCharacter[random.Next(oCharacter.Length)];
        //checkCode += number.ToString();
      }
      return checkCode;
    }

    private byte[] CreateCheckCodeImage(string checkCode)
    {
      if (checkCode == null || checkCode.Trim() == String.Empty)
      {
        return null;
      }
      int iWordWidth = 20;
      int iImageWidth = checkCode.Length * iWordWidth;
      Bitmap image = new Bitmap(iImageWidth, 30);
      Graphics g = Graphics.FromImage(image);
      try
      {
        //生成隨機生成器
        Random random = new Random();
        //清空圖片背景色
        g.Clear(Color.White);

        //畫圖片的背景噪音點
        for (int i = 0; i < 20; i++)
        {
          int x1 = random.Next(image.Width);
          int x2 = random.Next(image.Width);
          int y1 = random.Next(image.Height);
          int y2 = random.Next(image.Height);
          g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
        }

        //畫圖片的背景噪音線
        for (int i = 0; i < 2; i++)
        {
          int x1 = 0;
          int x2 = image.Width;
          int y1 = random.Next(image.Height);
          int y2 = random.Next(image.Height);
          if (i == 0)
          {
            g.DrawLine(new Pen(Color.Gray, 2), x1, y1, x2, y2);
          }

        }
        for (int i = 0; i < checkCode.Length; i++)
        {

           string Code = checkCode[i].ToString();
           int xLeft = iWordWidth * (i);
          random = new Random(xLeft);
          int iSeed = DateTime.Now.Millisecond;
          int iValue = random.Next(iSeed) % 4;
          if (iValue == 0)
          {
            Font font = new Font("Arial", 16, (FontStyle.Bold | System.Drawing.FontStyle.Italic));
            Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
            LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Red, 1.5f, true);
            g.DrawString(Code, font, brush, xLeft, 2);
          }
          else if (iValue == 1)
          {
            Font font = new System.Drawing.Font("楷體", 16, (FontStyle.Bold));
            Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
            LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.DarkRed, 1.3f, true);
            g.DrawString(Code, font, brush, xLeft, 2);
          }
          else if (iValue == 2)
          {
            Font font = new System.Drawing.Font("宋體", 16, (System.Drawing.FontStyle.Bold));
            Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
            LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Green, Color.Blue, 1.2f, true);
            g.DrawString(Code, font, brush, xLeft, 2);
          }
          else if (iValue == 3)
          {
            Font font = new System.Drawing.Font("黑體", 16, (System.Drawing.FontStyle.Bold |       

            System.Drawing.FontStyle.Bold));
            Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
            LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Green, 1.8f, true);
            g.DrawString(Code, font, brush, xLeft, 2);
          }
        }
        ////畫圖片的前景噪音點 ---有無這段代碼 貌似沒啥變化
        for (int i = 0; i < 8; i++)
        {
          int x = random.Next(image.Width);
          int y = random.Next(image.Height);
          image.SetPixel(x, y, Color.FromArgb(random.Next()));
        }
        //畫圖片的邊框線
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        return ms.ToArray();
        //Response.ClearContent();
        //Response.ContentType = "image/jpeg";
        //Response.BinaryWrite(ms.ToArray());
      }
      finally
      {
        g.Dispose();
        image.Dispose();
    }
  }

好了,就到這裡了,有問題或者不正確的可以指正,我每天都會看一次。謝謝,希望對你有幫助。

說一下,這個代碼的格式化 ,太麻煩了,每次都要一行一行的tab鍵。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CLR就是公共運行時,本文就對c#編寫SQL StoredProcedures的過程進行簡單講解。 【步驟】 2. 3. 7.打開設置 8. 註意刪除方式:註意刪除Assembly時,一定要先把引用此Assembly的所有東西刪除drop proc QueryQueueSPgo drop assem ...
  • 項目相關的快捷鍵 Ctrl + Shift + B = 生成項目 Ctrl + Alt + L = 顯示Solution Explorer(解決方案資源管理器) Shift + Alt+ C = 添加新類 Shift + Alt + A = 添加新項目到項目 編輯相關的鍵盤快捷鍵 Ctrl + En ...
  • 在.net的項目開發中,經常會對XML文件進行操作,由於XML文件可以實現跨平臺傳輸,較多的應用在數據傳輸中,特總結以下幾種常用的XML操作方法: 1.創建XML文檔: 2.讀取XML文檔中的數據: 3.對XML文檔插入數據: 4.修改XML文檔中的數據: 5.刪除XML文檔中數據: 6.讀取XML ...
  • 1.什麼是ORM ORM的全稱是Object Relational Mapping,即對象關係映射。它的實現思想就是將關係資料庫中表的數據映射成為對象,以對象的形式展現,這樣開發人員就可以把對資料庫的操作轉化為對這些對象的操作。因此它的目的是為了方便開發人員以面向對象的思想來實現對資料庫的操作。 2 ...
  • 文章出處:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html ...
  • 首先需要添加的命名空間 using System.Web.UI.WebControls;using System.Drawing.Drawing2D;using System.Drawing.Imaging; 編寫一個生成隨機數的方法,此方法很簡單,返回的是一個字元串也就是需要顯示到驗證碼中的字元串 ...
  • 當運行一個 Asp.Net Core 應用的時候, WebHostBuilder 根據環境變數來判斷當前運行的是哪個環境,可能是 Development,Staging或者Production.你也可以設置成隨便的一個字元串. 這個鏈接將會告訴你 如何在各種平臺各種環境中設置環境變數.但如果你使用 ...
  • 修飾符 訪問許可權 public 關鍵字是類型和類型成員的訪問修飾符。 公共訪問是允許的最高訪問級別。 對訪問公共成員沒有限制 private 私有訪問是允許的最低訪問級別。 私有成員只有在聲明它們的類和結構體中才是可訪問的 protected 受保護的,訪問許可權於包含類或包含類派生的類型 inter ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...