验证码往往由a-z,0-9等字符组成,所以我们可以设计一个方法,根据参数x随机返回x个字符,具体代码如下:
public String randString(int count){
StringBuilder builder = new StringBuilder();
String str = "abcdefghijklmnpqrstuvwxy0123456789";
Random rnd = new Random();
for(int i=0;i<count;i++){
int pos = rnd.nextInt(str.length());
String s =str.substring(pos,pos+1);
builder.append(s);
}
return builder.toString();
}
制作验证码还需要画笔
BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
建一个随机变量,下面步骤要用到
Random r =new Random();
设置验证码背景画布
g.setColor(Color.white);
g.fillRect(0,0,WIDTH,HEIGHT);
设置验证码字符样式以及绘制验证码
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.PLAIN,36));
String code = randString(4);
g.drawString(code,20,50);
添加混淆视野的线条
for(int i=0;i<10;i++){
g.setColor(Color.BLUE);
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
}
添加混淆视野的噪点
for(int j=0;j<10;j++){
g.drawOval(r.nextInt(WIDTH),r.nextInt(HEIGHT),5,5);
}
真实效果图:
完整源代码:
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/captche")
public class CaptcheController extends HttpServlet {
private final int WIDTH=100;
private final int HEIGHT=80;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
Random r =new Random();
g.setColor(Color.white);
g.fillRect(0,0,WIDTH,HEIGHT);
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.PLAIN,36));
String code = randString(4);
g.drawString(code,20,50);
for(int i=0;i<10;i++){
g.setColor(Color.BLUE);
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
}
for(int j=0;j<10;j++){
g.drawOval(r.nextInt(WIDTH),r.nextInt(HEIGHT),5,5);
}
g.dispose();
ServletOutputStream out =resp.getOutputStream();
ImageIO.write(img,"jpg",out);
try{
out.flush();
}finally{
out.close();
}
}
public String randString(int count){
StringBuilder builder = new StringBuilder();
String str = "abcdefghijklmnpqrstuvwxy0123456789";
Random rnd = new Random();
for(int i=0;i<count;i++){
int pos = rnd.nextInt(str.length());
String s =str.substring(pos,pos+1);
builder.append(s);
}
return builder.toString();
}
}