关于java web的验证码生成
本节难点是对于Random随机数的使用,和BufferedImage画布的使用。
先写一个service用于后续用户界面获取验证码
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletOutputStream sos = resp.getOutputStream();
//resp用于输出
ImageIO.write(generatePic(100,80,builder), "JPEG",sos);
//获取传过来得字符
String tempStr = builder.toString();
// req.getSession().setAttribute("sessionCacheData",tempStr);
sos.flush();
sos.close();
}
####进行画布的绘制
private BufferedImage generatePic(int width ,int height,StringBuilder builder){
//获得一个彩色画布
BufferedImage image=new BufferedImage(100,50,BufferedImage.TYPE_INT_BGR);
Graphics g=image.getGraphics();
//图片背景和框架
g.setColor(Color.white); //设置背景色
g.fillRect(0,0,width,height);//显示矩形框架
StringBuilder builder=new StringBuilder();
//用于缓存存放随机四个字符
//设置随机类
String data="ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz";//随机字符 0O 1I等容易混淆的不用
Random rnd=new Random();//设置随机类
g.setFont(new Font("楷体",Font.BOLD,20));//设置字体类型,形状,大小
//每个字符随机
for (int i=0;i<=4;i++) {
//随机字符
int index = rnd.nextInt(data.length());
//得到随机字符
String str = data.substring(index, index + 1);
//写入字符str,和存在的x,y位置
g.drawString(str, (width / 6) * (i + 1), 20);
//设置随机颜色
Color color = new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
//字体得到随机颜色
g.setColor(color);
//写入字体得颜色a
builder.append(str);
}
//制造噪点
for(int j=0,n=rnd.nextInt(100);j<n;j++){
g.setColor(Color.RED);
g.fillRect(rnd.nextInt(width),rnd.nextInt(height),1,1);//随机噪音点
}
return image;
}
}
学习小结
- BufferedImage彩色画布创建
- Graphics 对于画布得绘制
-Random随即类 random.nextInt(n)产生随机[0,n)区间得使用