<b style=“font-color:red;”>圖片驗(yàn)證碼原理:</b>服務(wù)器生成包含隨機(jī)字符的字符串圖片發(fā)給客戶端搂抒,客戶端提交數(shù)據(jù)需要填寫字符串作為驗(yàn)證持寄。而字符串保存在圖片中,機(jī)器難以識(shí)別伊磺,達(dá)到防止有人利用程序惡意發(fā)送信息的目的官套。
JAVA隨機(jī)生成圖片
JAVA隨機(jī)生成圖片步驟如下:
- 創(chuàng)建圖片緩存區(qū) 傳參為寬高和圖片類型
BufferedImage bi = new
BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- 獲取畫筆并繪畫
Graphics g = bi.getGraphics(); //獲取畫筆
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//設(shè)置字體
g.setColor(color);//設(shè)置畫筆顏色
g.fillRect(0, 0, width, height); //繪制背景
- 輸出圖片
ImageIO.write(bi, "JPG", resp.getOutputStream());
JAVA實(shí)現(xiàn)驗(yàn)證碼實(shí)例
servlet生成驗(yàn)證碼圖片源碼
package com.javaweb.respones;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IdentityServlet extends HttpServlet{
// 設(shè)置字符
public static final char[] chars="1234567890QWERTYUIOPASDFGHJKLZXCVBNM".toCharArray();
// 設(shè)置隨機(jī)數(shù)
public static Random random = new Random();
// 獲取4位隨機(jī)數(shù)
public static String getRandomString(){
StringBuffer buffer = new StringBuffer();
int index; //獲取隨機(jī)chars下標(biāo)
for(int i=0;i<4;i++){
index = random.nextInt(chars.length); //獲取隨機(jī)chars下標(biāo)
buffer.append(chars[index]);
}
return buffer.toString();
}
// 獲取隨機(jī)顏色
public static Color getRandomColor(){
return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
}
// 返回某顏色的反色
public static Color getReverseColor(Color c){
// 防止反色和原色相近
if(c.getRed()<130&&c.getRed()>125 && c.getBlue()<130&& c.getBlue()>125 &&
c.getGreen()<130&&c.getGreen()>125){
return new Color(255,255,255);
}else{
return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String code = getRandomString(); //獲取隨機(jī)驗(yàn)證碼
req.getSession().setAttribute("code", code); //放入Session
int width = 100; //圖片寬度
int height = 30; //圖片高度
Color color = getRandomColor(); //隨機(jī)色酒奶,用于背景色
Color reverse = getReverseColor(color); //反色,用于前景色
/**
* 生成帶字符串的文本圖片
*/
// 1.創(chuàng)建圖片緩存區(qū) 傳參為寬高和圖片類型
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
// 2.獲取畫筆并繪畫
Graphics g = bi.getGraphics();
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//設(shè)置字體
g.setColor(color);//設(shè)置畫筆顏色
g.fillRect(0, 0, width, height); //繪制背景
g.setColor(reverse); //設(shè)置畫筆顏色
g.drawString(code, 18, 20); //繪制字符
// 設(shè)置最多100個(gè)噪音點(diǎn)
for(int i=0,n = random.nextInt(100);i<n;i++){
g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 3.輸出圖片
ImageIO.write(bi, "JPG", resp.getOutputStream());
}
}
生成圖片驗(yàn)證碼主要應(yīng)用隨機(jī)數(shù)生成器Random生成隨機(jī)顏色繪制背景虏杰,取反色*繪制字符,并繪制最多100隨機(jī)位置的噪音點(diǎn)讥蟆,增加識(shí)別難度。
配置XML
<servlet>
<servlet-name>IdentityServlet</servlet-name>
<servlet-class>com.javaweb.respones.IdentityServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IdentityServlet</servlet-name>
<url-pattern>/servlet/IdentityServlet</url-pattern>
</servlet-mapping>
html展示頁(yè)面
<head>
<script type="text/javascript">
function reloadImage(){
document.getElementById('btn').disable=true;
document.getElementById('identity').src='servlet/IdentityServlet?time='
+new Date().getTime();
}
</script>
</head>
<body>
<img src = "servlet/IdentityServlet" id="identity" onload="btn.disabled= false;">
<input type="button" value="換個(gè)圖片" onclick="reloadImage()" id="btn">
</body>
截圖展示
下篇介紹利用組件Jcaptcha和Kaptcha生成驗(yàn)證碼纺阔。