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

首頁 > 網站 > WEB開發 > 正文

使用java隨機生成驗證碼

2024-04-27 15:08:59
字體:
來源:轉載
供稿:網友

作者:傳智播客java培訓學院首發:http://www.itcast.cn/javaee

生成驗證碼圖片驗證碼是Completely Automated Public Turing test to tell Computers and Humans Apart(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序,可以防止:惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一特定注冊用戶,用特定程序暴力破解方式進行不斷的登錄嘗試。實際上驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。下面我們就來學習如何自動生成一個驗證碼圖片,案例的源代碼點擊此處進行下載,具體如下:

1.生成字符驗證碼

大家想必在登錄某個網站的時候都輸入過驗證碼,如圖1-1所示:

圖1-1驗證碼

下面通過一個案例來學習如何自動生成一個驗證碼圖片:(1)創建一個web應用,名稱為Example1,在該應用下的src目錄下新建一個Class類,名稱為ImageTest,主要代碼如例1-1所示:例1-1 ImageTest.java

public class ImageTest {    @Testpublic void fun1() throws FileNotFoundExceptionIOException{       /*        * 1. 創建圖片緩沖區        * 2. 設置其寬高        * 3. 得到這個圖片的繪制環境(得到畫筆)        * 4. 保存起來        */       BufferedImage bi = new BufferedImage(70, 35, BufferedImage.TYPE_INT_RGB);       Graphics2D g = (Graphics2D)bi.getGraphics();//得到繪制環境       g.setColor(Color.WHITE);//把環境設置為白色       g.fillRect(0, 0, 70, 35);//填充矩形!填充矩形,從0,0點開始,寬70,高35,即整個圖片,即為圖片設置背景色       g.setColor(Color.RED);//把環境設置為紅色       g.drawString("Hello", 2, 35-2);//向圖片上寫入字符串,其中2,2表示x,y軸的坐標       ImageIO.write(bi, "JPEG", new FileOutputStream("F:/xxx.jpg"));}}

在例1-1中,首先要獲得圖片緩沖區,即BufferedImage類的一個對象,BufferedImage類的構造方法中,第一個參數和第二個參數表示圖片的長和寬,第三個參數是圖片的類型;然后獲取繪制環境,也可以理解為獲取當前圖片的畫筆,使用該對象可以設置一系列的屬性,例如圖片的背景顏色、填充形狀等。最后使用ImageIO類的write()方法將當前畫好的圖片寫到指定的輸出流中。(2)測試fun1()方法,去F盤查看生成的圖片效果如何,如圖1-2所示:

圖1-2 繪制的圖片如圖1-2所示,繪制的圖片背景色是白色,字符串“Hello”的顏色是紅色,該字符串的位置也是由我們自己設置的,可以調整。

2.生成字母驗證碼

通過以上對自動繪制圖片的了解,下面我們來完成另外一個繪制圖片的類,這個類相較于上面的ImageTest類要復雜很多,如下所示:(1)在ImageTest同包下新建一個Class類,名稱為VerifyCode,下面我們對類中的方法進行一一介紹。首先來看該類的成員變量,如例1-2所示:例1-2 VerifyCode.java類中的成員變量

public class VerifyCode {    PRivate int w = 70;    private int h = 35;    private Random r = new Random();    // {"宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑", "楷體_GB2312"}    private String[] fontNames  = {"宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312"};    // 可選字符    private String codes="23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUV                              WXYZ";    // 背景色    private Color bgColor  = new Color(255, 255, 255);    // 驗證碼上的文本    private String text ;

例1-2中,成員變量w、h分別表示圖片的長和寬;成員變量r是Random類型的對象,用來生成隨機數;成員變量fontNames是列舉驗證圖片中驗證碼的字體類型;成員變量codes是列舉驗證碼的所有的可選字符;成員變量bgColor是驗證圖片的背景色;成員變量text是圖片上的驗證碼。(2)VerifyCode類的生成隨機顏色的方法,主要代碼如例1-3所示:例1-3  randomColor()方法

    // 生成隨機的顏色private Color randomColor () {       int red = r.nextInt(150);       int green = r.nextInt(150);       int blue = r.nextInt(150);       return new Color(red, green, blue);}

例1-3中,r是Random類型的對象,r.nextInt(int n)方法返回一個偽隨機數,它是取自此隨機數生成器序列的、在 0(包括)和指定值n(不包括)之間均勻分布的 int值。其中局部變量red、green、blue分別代表顏色的RGB的紅、綠、藍三個通道的顏色值。該方法返回的是隨機產生的顏色。(3)VerifyCode類的生成隨機字體的方法,主要代碼如例1-4所示:例1-4  randomFont()方法

// 生成隨機的字體private Font randomFont () {           int index = r.nextInt(fontNames.length);           String fontName = fontNames[index];//生成隨機的字體名稱           int style = r.nextInt(4);//生成隨機的樣式, 0(無樣式), 1(粗體), 2(斜體), 3(粗體+斜體)           int size = r.nextInt(5) + 24; //生成隨機字號, 24 ~ 28           return new Font(fontName, style, size);}

例1-4中,r.nextInt(fontNames.length)方法是獲得一個從0到成員變量fontNames數組的長度之間的整數index,然后將這個整數當作fontNames數組的下標,找到對應的字體類型。局部變量style是隨機產生的樣式,詳情可參考例1-4中的代碼注釋,局部變量size是隨機生成的字體大小,即字號,范圍是從24~28;最后將該字體返回。(4)VerifyCode類的生成隨機的干擾線方法,主要代碼如例1-5所示:例1-5 drawLine()方法

  // 畫干擾線private void drawLine (BufferedImage image) {       int num  = 3;//一共畫3條       Graphics2D g2 = (Graphics2D)image.getGraphics();       for(int i = 0; i < num; i++) {//生成兩個點的坐標,即4個值           int x1 = r.nextInt(w);           int y1 = r.nextInt(h);           int x2 = r.nextInt(w);           int y2 = r.nextInt(h);           g2.setStroke(new BasicStroke(1.5F));           g2.setColor(Color.BLUE); //干擾線是藍色           g2.drawLine(x1, y1, x2, y2);//畫線       }}

例1-5中,局部變量num是記錄干擾線的條數,然后創建當前圖片的畫筆Graphics2D類的對象,再利用r對象生成四個值,其中x1和x2的大小范圍在0~70之間,y1和y2的大小在0~35之間,這四個值是用來作為確定一條直線的兩個點的坐標,由于有三條干擾線,所以這里使用for循環,然后每循環一次就使用畫筆對象g2的drawLine()方法繪制一條線。(5)VerifyCode類的生成隨機字符的方法,主要代碼如例1-6所示:

// 隨機生成一個字符private char randomChar () {       int index = r.nextInt(codes.length());       return codes.charAt(index);}

例1-6中,驗證碼的所有可選字符都在字符串codes中,通過r對象的nextInt()方法獲得一個在0到codes.length范圍內的整數index,然后調用charAt(index)方法獲得指定索引的字符,并返回。(6)VerifyCode類的創建BufferedImage的方法,主要代碼如例1-7所示:

    // 創建BufferedImageprivate BufferedImage createImage () {       BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);       Graphics2D g2 = (Graphics2D)image.getGraphics();       g2.setColor(this.bgColor);       g2.fillRect(0, 0, w, h);       return image;}

例1-7中,創建BufferedImage對象的步驟與例1-1相同,最后將創建的對象返回。(7)VerifyCode類的獲得驗證碼圖片上的文本方法,主要代碼如例1-8所示:

    // 返回驗證碼圖片上的文本public String getText () {       return text;}

例1-8中的text是成員變量,代表圖片上的驗證碼。該方法要在另一個方法getImage()調用之后調用,getImage()方法后面會詳解。(8)VerifyCode類的將圖片保存到指定的輸出流,主要代碼如例1-9所示:

    // 保存圖片到指定的輸出流public static void output (BufferedImage image, OutputStream out)              throws IOException {       ImageIO.write(image, "JPEG", out);}

例1-9中,output()方法有兩個參數,第一個參數是繪制的圖片,第二個參數是圖片將要保存的輸出流;使用ImageIO類的write()方法將image對象以JPEG的格式保存在out輸出流中。(9)VerifyCode類的得到驗證碼圖片的方法,主要代碼如例1-10所示:

    // 調用這個方法得到驗證碼public BufferedImage getImage () {       BufferedImage image = createImage();//創建圖片緩沖區       Graphics2D g2 = (Graphics2D)image.getGraphics();//得到繪制環境       StringBuilder sb = new StringBuilder();//用來裝載生成的驗證碼文本       // 向圖片中畫4個字符       for(int i = 0; i < 4; i++)  {//循環四次,每次生成一個字符           String s = randomChar() + "";//隨機生成一個字母           sb.append(s); //把字母添加到sb中           float x = i * 1.0F * w / 4; //設置當前字符的x軸坐標           g2.setFont(randomFont()); //設置隨機字體           g2.setColor(randomColor()); //設置隨機顏色           g2.drawString(s, x, h-5); //畫圖       }       this.text = sb.toString(); //把生成的字符串賦給了this.text       drawLine(image); //添加干擾線       return image;    }

例1-10中,先調用createImage()方法創建圖片緩沖區,然后得到繪制環境,即當前圖片的畫筆;再創建一個用來保存驗證碼文本的StringBuilder對象,利用for循環及以上提到的方法向圖片中畫4個字符,然后將sb對象的值賦給成員變量text,這時調用例1-8中的getText()方法就可以獲得驗證碼文本。最后添加干擾線,再返回image對象。(10)以上就是VerifyCode類的所有方法,現在我們在ImageTest類中定義一個單元測試方法fun2(),該方法的主要內容如例1-11所示:

@Testpublic void fun2() throws FileNotFoundException, IOException{           VerifyCode vc = new VerifyCode();//創建VerifyCode類的對象           BufferedImage bi = vc.getImage();//調用getImge()方法獲得一個BufferedImage對象           VerifyCode.output(bi, new FileOutputStream("F:/驗證碼.jpg"));//調用靜態方法output()方法將圖片保存在文件輸出流中           System.out.println(vc.getText());//在控制臺上打印驗證碼的文本值}

(11)執行fun2()方法,控制臺上打印結果如圖1-3所示:圖1-3驗證碼信息(12)由圖1-3可知,驗證碼文本信息為“pxTy”,現在去F盤中找到驗證碼.jpg,打開如圖1-4所示:圖1-4驗證碼在以后的開發中,想獲得驗證碼就可以把VerifyCode類當作一個幫助類,將它拷貝到自己的項目中然后調用相應的方法就可以獲得驗證碼圖片。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲老板91色精品久久| 国产裸体写真av一区二区| 日韩精品一二三四区| 青青草99啪国产免费| 欧美影院成年免费版| 日韩亚洲欧美中文高清在线| 国产午夜精品美女视频明星a级| 欧美美女18p| 91av在线视频观看| 日韩中文综合网| 亚洲精品久久视频| 日韩av一区二区在线| 欧美www视频在线观看| 热草久综合在线| 欧美理论电影在线观看| 欧美一区在线直播| 高清亚洲成在人网站天堂| 综合激情国产一区| 亚洲精品美女久久久| 91亚洲国产成人精品性色| 91深夜福利视频| 欧美亚洲日本网站| 日韩高清欧美高清| www日韩中文字幕在线看| 中文字幕国产精品久久| 日韩中文理论片| 欧美极品少妇与黑人| 亚洲激情小视频| 久久成人这里只有精品| 亚洲天堂成人在线视频| 欧美激情亚洲另类| 亚洲美女激情视频| 亚洲石原莉奈一区二区在线观看| 亚洲成av人乱码色午夜| 国产精品久久久精品| 国产欧美最新羞羞视频在线观看| 一区二区三区国产在线观看| 性色av一区二区三区免费| 7777精品视频| 91精品综合久久久久久五月天| 成人免费午夜电影| 伊人久久久久久久久久久| 在线视频欧美日韩| 亚洲美女免费精品视频在线观看| 亚洲一级黄色av| 久久夜色精品国产亚洲aⅴ| 午夜精品久久久99热福利| 欧美性色视频在线| 日韩黄色av网站| 96精品久久久久中文字幕| 成人免费高清完整版在线观看| 91免费精品国偷自产在线| 91av国产在线| 日韩美女激情视频| 亚洲第一av在线| 丝袜美腿精品国产二区| 最近2019中文字幕在线高清| 欧美在线播放视频| 国产欧亚日韩视频| 欧美高清无遮挡| 国产亚洲精品久久久优势| 91精品国产乱码久久久久久久久| 日韩欧美大尺度| 亚洲一区二区久久久久久| 亚洲欧美中文字幕在线一区| 日本乱人伦a精品| 91天堂在线视频| 青青久久av北条麻妃黑人| 色中色综合影院手机版在线观看| 欧洲亚洲免费在线| 91国偷自产一区二区三区的观看方式| 操人视频在线观看欧美| 欧美日本在线视频中文字字幕| 亚洲午夜精品久久久久久久久久久久| 丝袜美腿精品国产二区| 91麻豆国产语对白在线观看| 国产98色在线| 久久人91精品久久久久久不卡| 国产精品久久97| 亚洲18私人小影院| 欧美日本高清一区| 欧美精品18videos性欧美| 亚洲女性裸体视频| 国产精品视频一区国模私拍| 国产精品扒开腿做| 亚洲成人精品在线| 国产一区二区三区在线观看视频| 美女久久久久久久久久久| 欧美激情国内偷拍| 亚洲精品白浆高清久久久久久| 中文字幕成人精品久久不卡| 国产狼人综合免费视频| 亚洲性视频网站| 国内揄拍国内精品| 亚洲欧美福利视频| 4438全国亚洲精品在线观看视频| 亚洲最大福利视频网站| 色av中文字幕一区| 欧美激情亚洲精品| 日本视频久久久| 丝袜一区二区三区| 高潮白浆女日韩av免费看| 精品一区精品二区| 亚洲va欧美va国产综合剧情| 欧美国产激情18| yellow中文字幕久久| 欧美精品做受xxx性少妇| 国产欧美日韩高清| 日韩暖暖在线视频| y97精品国产97久久久久久| 色综合影院在线| 2019精品视频| 日韩中文字幕网| 亚洲欧美国产日韩中文字幕| 最近2019中文字幕mv免费看| 久久国产精品久久久久久久久久| 日韩高清免费观看| 国产日产亚洲精品| 欧美在线视频免费播放| 一区二区欧美久久| 久久中文字幕一区| 91牛牛免费视频| 久久99精品久久久久久琪琪| 亚洲最大的av网站| 日韩欧美在线中文字幕| 亚洲欧洲日产国产网站| 热久久视久久精品18亚洲精品| 国产成人高清激情视频在线观看| 奇米一区二区三区四区久久| 国产视频亚洲视频| 国内免费久久久久久久久久久| 国模精品视频一区二区三区| 亚洲精品第一国产综合精品| 91精品中文在线| 久久久成人的性感天堂| 人人做人人澡人人爽欧美| 色噜噜国产精品视频一区二区| 日韩在线视频导航| 久久精品色欧美aⅴ一区二区| 精品久久久久久中文字幕| 国内精品国产三级国产在线专| 欧美性猛交xxxx久久久| 中文欧美在线视频| 最近2019中文免费高清视频观看www99| 97视频网站入口| 久久久女女女女999久久| 91精品啪在线观看麻豆免费| 欧美日韩中文字幕综合视频| 91精品国产沙发| 裸体女人亚洲精品一区| 亚洲人成网站在线播| 亚洲视频在线观看| 欧美精品中文字幕一区| 国产91对白在线播放| 国产精品久久久久久久久久久久久久| 亚洲九九九在线观看| 欧美性videos高清精品| 国产脚交av在线一区二区| 亚洲精品xxxx| 国产精品美乳在线观看| 国产91网红主播在线观看| 欧美精品激情在线观看| 中文字幕免费国产精品| 色综合久久久久久中文网|