在許多登錄界面,有着多次輸入密碼錯誤就會產生驗證碼防止有企圖的人強力破解密碼!
在這裏我要實現的驗證碼像這樣
隨機的顏色隨機的字母,還有隨機顏色隨機位置的線來影響圖片識別算法的準確性!
挺簡單的,直接看代碼吧!
package checkCode;
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 checkCodeServlet extends HttpServlet {
public final static int W = 120;
public final static int H = 50;
Random random = new Random();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BufferedImage img = new BufferedImage(W,H,BufferedImage.TYPE_INT_BGR);
Graphics g = img.getGraphics();
g.setColor(Color.yellow);
g.fillRect(200,500,W,H,10,10);
drawLines(g);
drawCharacter(g);
ImageIO.write(img, "jpg", response.getOutputStream());
g.dispose();//釋放資源!
}
//在圖片上寫下隨機數字!
public void drawCharacter(Graphics g){
String str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHKJLZXCVBNM";
for(int i = 0; i<4; i++){
int index = random.nextInt(str.length());
setColor(g);
g.setFont(new Font("宋體", Font.BOLD, 30));
g.drawString("" + str.charAt(index), 20*i+20, 30);
}
}
//畫隨機線
public void drawLines(Graphics g){
int count = random.nextInt(20);
for(int i = 0; i<count; i++){
int x1 = random.nextInt(W);
int x2 = random.nextInt(W);
int y1 = random.nextInt(H);
int y2 = random.nextInt(H);
setColor(g);
g.drawLine(x1, y1, x2, y2);
}
}
//隨機選擇畫筆顏色!
public void setColor(Graphics g){
int R = random.nextInt(256);
int B = random.nextInt(256);
int G = random.nextInt(256);
Color c = new Color(R, B, G);
g.setColor(c);
}
}
挺簡單的,不多說,後續再更新有登錄界面的驗證碼和驗證步驟!因爲現在還不知道怎麼寫 /滑稽