在许多登录界面,有着多次输入密码错误就会产生验证码防止有企图的人强力破解密码!
在这里我要实现的验证码像这样
随机的颜色随机的字母,还有随机颜色随机位置的线来影响图片识别算法的准确性!
挺简单的,直接看代码吧!
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);
}
}
挺简单的,不多说,后续再更新有登录界面的验证码和验证步骤!因为现在还不知道怎么写 /滑稽