[转]【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
本文轉自:http://www.cnblogs.com/yuangang/p/6000460.html
目錄索引
?
【無私分享:ASP.NET CORE 項目實戰】目錄索引
?
簡介
?
很長時間沒有來更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其實已經完成了一個框架了,并且正在準備在生產環境中試用,但是很多東西也是出于自己理解的膚淺和技術的不斷更新,經常變動,所以,如果自己還沒有完全搞好,就來寫博客,反復的修正,可能會誤導一些新手朋友。
如果有正在研究Core的朋友,可以大家一起交流下。
?
?
驗證碼
相信很多朋友跟我一樣,圖形驗證碼成為了 Core 的一個絆腳石。
?
System.Drawing.Primitives 這是官方的一個Drawing庫,但是沒有Bitmap、Graphics等很多東西,所以這個做圖形驗證碼基本Pass了。
?
? ?CoreCompat.System.Drawing 這個是一個第三方的,使用了mono的System.Drawing實現,只要安裝了之前使用System.Drawing的代碼完全不用修改,也支持描畫驗證碼等描畫類的功能。如果需要linux或osx支持,可以安裝runtime.linux.CoreCompat.System.Drawing和runtime.osx.10.10-x64.CoreCompat.System.Drawing。(地址:https://github.com/CoreCompat/CoreCompat),基本大家都是在用這個吧,這個在Windows下是沒有任何問題的,在Linux上一直沒有成功,也不知道是自己編譯的問題還是什么問題。
?
?
? zkweb.system.drawing 這個也是第三方的,從mono的System.Drawing修改得來的。過程比較詳細,也實現了。所以把這個的使用跟大家分享一下。
?
這個類庫和CoreCompat的不同點如下
?
- 沒有使用強名稱,CoreCompat為了讓程序集名稱一樣使用了一個偽造的簽名,但是導致Asp.Net和Owin等會檢查簽名的舊項目啟動失敗
- CoreCompat的項目如果直接下載編譯會出現100多個錯誤,大多是類型找不到的錯誤,我也不知道作者是怎么編譯過去的 這個項目從mono 4.6.1.13復制了所有需要的文件并修改,直接下載編譯就可以通過
- 可以使用dotnet test跑單元測試,目前通過率約為80%
- 實際在linux上測試過并且給出了各個發行版安裝libgdiplus的命令,目前已測試不引用System.Drawing.Primitive,因為System.Drawing.Primitive在.Net Framework下同時引用了原來的System.Drawing,有可能導致編譯時類型沖突(實測只有警告)
- Ubuntu Server 16.04 LTS 64bit
- Fedora 24 64bit
- CentOS 7.2 64bit
?
?
?
Zkweb.system.drawing
首先通過Nuget:?Install-Package ZKWeb.System.Drawing 添加 引用
?
?
簡單的圖形驗證碼生成:
?
1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用于生成指定位數的隨機數 5 /// </summary> 6 /// <param name="VcodeNum">參數是隨機數的位數</param> 7 /// <returns>返回一個隨機數字符串</returns> 8 private string RndNum(int VcodeNum) 9 { 10 //驗證碼可以顯示的字符集合 11 string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" + 12 ",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" + 13 ",R,S,T,U,V,W,X,Y,Z"; 14 string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成數組 15 string code = "";//產生的隨機數 16 int temp = -1;//記錄上次隨機數值,盡量避避免生產幾個一樣的隨機數 17 18 Random rand = new Random(); 19 //采用一個簡單的算法以保證生成隨機數的不同 20 for (int i = 1; i < VcodeNum + 1; i++) 21 { 22 if (temp != -1) 23 { 24 rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化隨機類 25 } 26 int t = rand.Next(61);//獲取隨機數 27 if (temp != -1 && temp == t) 28 { 29 return RndNum(VcodeNum);//如果獲取的隨機數重復,則遞歸調用 30 } 31 temp = t;//把本次產生的隨機數記錄起來 32 code += VcArray[t];//隨機數的位數加一 33 } 34 return code; 35 } 36 37 /// <summary> 38 /// 該方法是將生成的隨機數寫入圖像文件 39 /// </summary> 40 /// <param name="code">code是一個隨機數</param> 41 /// <param name="numbers">生成位數(默認4位)</param> 42 public MemoryStream Create(out string code, int numbers = 4) 43 { 44 code = RndNum(numbers); 45 Bitmap Img = null; 46 Graphics g = null; 47 MemoryStream ms = null; 48 Random random = new Random(); 49 //驗證碼顏色集合 50 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; 51 52 //驗證碼字體集合 53 string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" }; 54 55 56 //定義圖像的大小,生成圖像的實例 57 Img = new Bitmap((int)code.Length * 18, 32); 58 59 g = Graphics.FromImage(Img);//從Img對象生成新的Graphics對象 60 61 g.Clear(Color.White);//背景設為白色 62 63 //在隨機位置畫背景點 64 for (int i = 0; i < 100; i++) 65 { 66 int x = random.Next(Img.Width); 67 int y = random.Next(Img.Height); 68 g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); 69 } 70 //驗證碼繪制在g中 71
轉載于:https://www.cnblogs.com/freeliver54/p/6278797.html
總結
以上是生活随笔為你收集整理的[转]【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Service Wrapper
- 下一篇: python commands模块在py