驗證碼的出現在一定程度上降低了程序被攻擊的風險,也使得我們的軟件安全性得到有效提高。Java發展至今,網上也出現了各種各樣的驗證碼:有圖像驗證碼,字符驗證碼,還有用于計算的驗證碼等等。接下來為大家介紹幾個原始驗證碼的寫法。效果如下:
第一款是基本的驗證碼,就背景顏色和字體顏色隨機的。第二款是每個字符都是不同的顏色。第三款是每個字符都有不同的傾斜角度。
驗證碼的實現原理:前端頁面發送請求【使用標簽】到后端,后端使用io流寫出一張圖片,前端頁面展示出來。前端代碼如下:
驗證碼:
onclick=\"this.src='code?r='+Math.random()\">
接下來就是后臺代碼實現了,后臺畫一張圖片實際上就跟美術生寫生一樣,先有一個畫板,然后在畫板上鋪上一張宣紙,在使用畫筆在宣紙上進行圖像的繪制。
第一部分:獲取畫板對象,并設置繪畫區域:
//=================================創建畫板(緩存圖片)=================================//
//1.創建畫板(緩存圖片)(參數:寬度,高度,圖像類型 -- 表示一個圖像,該圖像具有整數像素的 RGB 顏色)
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_BGR);
//2.根據緩沖圖片獲取一只畫筆,默認顏色為白色
Graphics g = image.getGraphics();
//3.創建隨機數對象,用于獲取隨機顏色
Random r = new Random();
//==================================畫背景(隨機顏色)==================================//
//4.先給筆設置顏色,才能設置畫的區域,范圍在0~255
//g.setColor(Color.gray);//設置固定顏色
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
//5.在畫板上設置畫的區域(參數:0,0表示起點的x和y坐標,100表示寬度,30表示高度)
g.fillRect(0, 0, 100, 30);
第二部分:畫字符串(隨機字符串,隨機顏色,隨機字體):
//6.獲取隨機字符串
String string = getString(4);
//7.為筆設置隨機顏色,少了這一步的話,就會與背景顏色一樣
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
//8.為該字符串設置隨機的字體
g.setFont(getFont());
//9.將字符串畫出(參數:畫的字符串,10,25指的是畫字符串的x坐標和字符串基線坐標y)
g.drawString(string, 10, 25);
第三部分:畫干擾線和干擾點
//==========================畫干擾線(隨機位置)===========================//
for(int i = 0 ; i < 4 ; i++){
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
//參數:第一個點的坐標(x,y) 第二個點的坐標(x,y)
//將筆強轉成Graphics2D類型
Graphics2D g1 = (Graphics2D)g;
//然后設置筆為原始寬度的1.5倍,Stroke:畫筆
g1.setStroke(new BasicStroke(1.5f));
g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));
}
//==========================畫干擾點(隨機位置)===========================//
for(int i = 0 ; i < 20 ; i++){
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
//參數:圓心坐標(x,y) 橫軸長度 縱軸長度,Oval橢圓
g.drawOval(r.nextInt(100), r.nextInt(30), 2, 2);
}
第四部分:畫出圖片,釋放資源
//============================將緩存圖片寫出去=============================//
//x.設置響應的類型
resp.setContentType(\"image/jpeg\");
//y.創建一個字節流(圖片是二進制文件,只能通過字節流寫出)
ServletOutputStream os = resp.getOutputStream();
//z.寫出圖片
ImageIO.write(image, \"jpeg\ os);
//關閉流釋放資源
os.close();
其他:自定義的方法:
//獲取隨機字符串
public String getString(int num){
//這里不寫0,O,1,l,2,z,6,b,U,V,v,u,9,q是因為用于不好區分,提高用戶體驗度
String words = \"acdefghjkmnprstwxy34578ACEFGHJKLMNPQRSTWXY\";
String result = \"\";
Random r = new Random();
for(int i = 0;i < num;i++){
result += words.charAt(r.nextInt(words.length())) + \" \";
}
return result;
}
//隨機字體
public Font getFont(){
Font] fonts = new Font5];
Random r = new Random();
fonts0] = new Font(\"微軟雅黑\ Font.ITALIC, 24);
fonts1] = new Font(\"新宋體\ Font.PLAIN, 24);
fonts2] = new Font(\"Microsoft YaHei UI\ Font.PLAIN, 24);
fonts3] = new Font(\"仿宋\ Font.PLAIN, 24);
fonts4] = new Font(\"Cambria\ Font.BOLD, 24);
return fontsr.nextInt(fonts.length)];
}
//隨機顏色
public Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256),
ran.nextInt(256), ran.nextInt(256));
return color;
}
實現不同字符的不同顏色:
StringBuilder string = new StringBuilder();
int left = 10;
for(int i = 0 ; i < 4 ; i++){
g.setColor(getRandomColor());
g.setFont(getFont());
String words = getString(1);
string.append(words);
g.drawString(words, left, 25);
left += 20;
}
實現不同字符的不同旋轉角度:
StringBuilder string = new StringBuilder();//接收驗證碼的字符串
int left = 10;//設置畫字符串的原始x坐標
int x = 15;//設置字符串旋轉的x坐標
Random ran = new Random();
for(int i = 0 ; i < 4 ; i++){
g.setColor(getRandomColor());//隨機顏色
g.setFont(getFont());//隨機字體
String words = getString(1);//獲取隨機字符
string.append(words);//拼接到字符串string
Graphics2D g2 = (Graphics2D)g;//轉換成Graphics2D對象,它才有rotate方法
double th = ran.nextInt(100)/100.0;//隨機旋轉角度
g2.rotate(th, x, 25);//旋轉一個字符
g2.drawString(words, left, 25);//畫字符串
g2.rotate(-th, x, 25);//調回原始角度
left += 20;//繼續畫下一個字符
x += 20;//繼續旋轉下一個字符
}
手機瀏覽
全國
19974831731





