HttpServletResponse实现验证码生成
编写验证码生成的函数
public String makenum(){
Random random = new Random();
String num = random.nextInt(99999) + "";
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 5 - num.length(); i++) {
stringBuffer.append("0");
}
num = stringBuffer.toString() + num;
return num;
}
编写servlet请求网页写入一个图片
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器五秒刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到一个图片
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();
//设置图片
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.BLUE);
graphics.setFont(new Font(null,Font.BOLD,20));
graphics.drawString(makenum(),0,20);
//告诉浏览器请求用浏览器方式打开
resp.setContentType("image/jpg");
//取消浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//写入浏览器
ImageIO.write(bufferedImage,"jpg", resp.getOutputStream());
}
改进
//1.定义一个方法返回一个随机验证码,n为生成几位的验证码
public static String makenum(int n) {
String codes="";
Random r=new Random();
//2.定义一个for循环,随机n次,随机生成字符
for(int i=0;i<n;i++) {
//3.生成随机字符,可能是数字,大写字母,小写字母
int num=r.nextInt(3);
switch(num) {
case 0:
//数字:0-9
codes+=r.nextInt(10);
break;
case 1:
//大写字母:A(65)-Z(65+25)
char ch1=(char)(r.nextInt(26)+65);
codes+=ch1;
break;
case 2:
//小写字母:a(97)-z(97+25)
char ch2=(char)(r.nextInt(26)+97);
codes+=ch2;
break;
}
}
return codes;
}