引言:
我們生活中登錄的時(shí)候都要輸入驗(yàn)證碼,這些驗(yàn)證碼是為了增加注冊(cè)或者登錄難度,減少被人用腳本瘋狂登錄注冊(cè)導(dǎo)致的一系列危害,減少數(shù)據(jù)庫(kù)的一些壓力。
畢竟那些用腳本生成的賬號(hào)都是垃圾賬號(hào)
本次實(shí)踐:生成這樣的驗(yàn)證碼
并且附帶一些干擾線
項(xiàng)目想法:
我們生成一個(gè)驗(yàn)證碼有好幾個(gè)要求
1.驗(yàn)證碼必須是隨機(jī)的,每次都不能重復(fù)出現(xiàn)一模一樣的
2.驗(yàn)證碼得讓人有體驗(yàn)感,最起碼得看得清,大小要合適
3.驗(yàn)證碼初步需要一些干擾線,防止很輕易的就被腳本識(shí)別出來(lái)。
初步學(xué)習(xí)先以這些為要求進(jìn)行實(shí)踐。
項(xiàng)目思路:
我們要理解這個(gè)驗(yàn)證碼的生成過(guò)程。
1.我們需要有一個(gè)畫板
2.我們需要一只筆可以在畫板上涂鴉
3.我們需要用筆在畫板上畫字符
4.我們需要調(diào)節(jié)畫板和字符的顏色,及其大小,提升體驗(yàn)感
5.我們需要畫出干擾線
項(xiàng)目實(shí)踐:
1.我們需要一些字母或者數(shù)字,這樣組成隨機(jī)的四位驗(yàn)證碼
我們可以寫一個(gè)程序快速生成這樣的數(shù)組
public class Zifu {
public static void main(String[] args) {
for(int i=0; i<26; i++){
char ch = (char) ('a' + i); // 生成字母
if (i != 25) {
System.out.print("\"" + ch + "\", ");
} else {
System.out.print("\"" + ch + "\"");
}
}
for(int i=0; i<10; i++){
char ch=(char)('0'+i);
if (i != 9) {
System.out.print("\"" + ch + "\", ");
} else {
System.out.print("\"" + ch + "\"");
}
}
for(int i=0; i<26; i++){
char ch = (char) ('A' + i); // 生成字母
if (i != 25) {
System.out.print("\"" + ch + "\", ");
} else {
System.out.print("\"" + ch + "\"");
}
}
}
}
輸出為:
然后我們將其復(fù)制粘貼在靜態(tài)數(shù)組里面
這樣我們就準(zhǔn)備好我們所需要的數(shù)組了
2.怎樣畫圖
畫圖的思路是:
1.準(zhǔn)備畫板
2.準(zhǔn)備筆
3.然后筆在畫板上畫
如何準(zhǔn)備畫板?
先導(dǎo)入相關(guān)包,畫板有專門的類是BufferedImage
筆相關(guān)的包是,Graphics
3.創(chuàng)建畫板
創(chuàng)建畫板要先實(shí)例化一個(gè)畫板,然后補(bǔ)充寬高和組成
int height=200;//高
int width=400;//寬
int imageType = BufferedImage.TYPE_INT_RGB;//畫板的組成,rgb是red,green,blue,紅綠藍(lán)組成
BufferedImage image = new BufferedImage(width,height,imageType);//實(shí)例化畫板對(duì)象,三個(gè)參數(shù)
代碼運(yùn)行后生成的jpg文件
4.生成隨機(jī)驗(yàn)證碼
這里需要用到random模塊
r是實(shí)例化Random的對(duì)象,r.newInt(界限),可以幫我們生成0到界限-1之間的隨機(jī)數(shù)值,我們可以通過(guò)它去隨機(jī)選取字符數(shù)組的下標(biāo)
生成的效果圖為
5.生成干擾線
干擾線原理其實(shí)與生成字符一樣
生成的重要代碼是g.drawLine(x1,y1,x2,y2);
意思是兩個(gè)點(diǎn)(x1,y1),(x2,y2)之間畫條直線
生成的效果圖為:
本次項(xiàng)目的小知識(shí)點(diǎn)
1.畫板有java自帶的BufferedImage,我們只需要導(dǎo)包就好了
2.筆有java自帶的Graphice,也是只要導(dǎo)包就好了
3.畫字符的時(shí)候字符的位置以及橫坐標(biāo)偏移,如果不偏移兩次畫在同一個(gè)地方就會(huì)覆蓋掉
4.字符的顏色,字體可以通過(guò)Font去設(shè)置
5.最后就是將畫出的圖生成在本地了
tips:最好的方法就是每做出一步就把圖生成在本地查看情況然后根據(jù)需求進(jìn)行調(diào)整,我上面的步驟就是一步一步來(lái)的。
本次驗(yàn)證碼生成的整體代碼如下:
文件路徑我就刪了,需要的朋友們自己補(bǔ)充吧,隨便找個(gè)空的文件夾然后復(fù)制地址就好了
格式是這樣的:
tips:為什么我用的都是\\,因?yàn)槿绻菃涡备艿脑捨业膙scode會(huì)識(shí)別為轉(zhuǎn)義字符,所以都用雙斜杠了\\
整體代碼如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796136.html
import java.awt.Color; // 引入 Color 類,提供系統(tǒng)顏色和關(guān)于顏色空間的類。
import java.awt.Font; // 引入 Font 類,支持在AWT的所有渲染環(huán)境下的通用文字布局,并為所有給定字符和腳本提供字體處理功能。
import java.awt.Graphics; // 引入 Graphics 類,允許應(yīng)用程序以協(xié)同的方式繪制到屏幕上或者其他任何地方。
import java.awt.image.BufferedImage; // 引入 BufferedImage 類,描述一些整數(shù)像素的具有可訪問(wèn)的數(shù)據(jù)緩沖區(qū)的圖像。
import java.io.File; // 引入 File 類,它提供了與文件和路徑名相關(guān)的操作,它具有創(chuàng)建、刪除、讀取文件等功能。
import java.io.IOException; // 引入 IOException 類,處理輸入、輸出操作失敗或中斷的情況(類似于文件未找到等)。
import java.util.Random; // 引入 Random 類,用于生成偽隨機(jī)數(shù)。
import javax.imageio.ImageIO; // 引入 ImageIO 類,用于讀取和寫入圖像格式,如 JPEG、PNG等。
public class checkimage {
static String[] strs={"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","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"};
public static void main(String[] args) {
int height=200;//高
int width=400;//寬
int imageType = BufferedImage.TYPE_INT_RGB;//畫板的組成,rgb是red,green,blue,紅綠藍(lán)組成
BufferedImage image = new BufferedImage(width,height,imageType);//實(shí)例化畫板對(duì)象,三個(gè)參數(shù)
Graphics g = image.getGraphics();//實(shí)例化了一支筆
g.setColor(Color.white);//筆的顏色為白色
g.fillRect(0, 0, width, height);//然后將畫板填充為白色,x,y為矩形左上角的坐標(biāo)
/*設(shè)置畫板 */
Random r=new Random();//實(shí)例化一個(gè)隨機(jī)的對(duì)象
int x=25,y=125;//這個(gè)是x,y界限
g.setColor(Color.blue);//讓驗(yàn)證碼的顏色為藍(lán)色
g.setFont(new Font("宋體",Font.PLAIN,100));//設(shè)置字體,字體為宋體,并且大小為100
for(int i=0;i<4;i++){//用for循環(huán)生成4個(gè)隨機(jī)驗(yàn)證碼
int index=r.nextInt(62);//strs數(shù)組總共62個(gè)數(shù),所以下標(biāo)界限是0-61
String str=strs[index];//隨機(jī)取一個(gè)字符
g.drawString(str, x, y);//畫字符在畫板上
x+=100;//這個(gè)移位,不然我第一次在這個(gè)位置畫A,第二次畫B的時(shí)候還在這個(gè)位置不就覆蓋掉了嗎,所以要移動(dòng)位置
}
/*畫出四位數(shù)的驗(yàn)證碼 */
g.setColor(Color.green);//讓畫筆的顏色為綠色
for(int i=0;i<10;i++){//生成十條干擾線
int a=r.nextInt(10);
int b=r.nextInt(400);
int c=r.nextInt(10)+380;
int d=r.nextInt(400);
g.drawLine(a,b,c,d);//ab是干擾線的左邊的橫縱坐標(biāo),cd是右邊的
}
/*畫出干擾線 */
// 嘗試寫入圖像
try {
ImageIO.write(image, "jpg", new File("C:\\Users\\Desktop\\項(xiàng)目學(xué)習(xí)\\myImage.jpg")); //此處應(yīng)給出具體的文件名
} catch (IOException e) {
e.printStackTrace();
}
}
}
這是我第一次除了做題之外做出的有用的東西了?。?!
雖然都是照著視頻學(xué)習(xí)照搬的,但是也是第一次對(duì)做這些有那么一點(diǎn)小感悟和經(jīng)歷了!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796136.html
到了這里,關(guān)于Java生成四位數(shù)隨機(jī)驗(yàn)證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!