public class ValidateCodeServlet extends HttpServlet {
private int width = 80;
private int height = 30;
private String validateString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private Random r = new Random();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//验证码是图片
//生成图片 在图片写入 字母和数字
//生成后写入到页面中
//先在内存中创建图片
//获取session对象 将生成的验证码放入session中
HttpSession session = request.getSession();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//在图片上面写字母 数字 设置颜色
//先获取画笔工具
Graphics g = image.getGraphics();
//给画笔设置颜色
g.setColor(new Color(200,200,200));
//设置画笔格式 font 第一个 格式的名字
g.setFont(new Font("宋体", Font.ITALIC, 25));
//画出矩形
g.fillRect(0, 0, width, height);
//在矩形中写入字母和数字
String validateCode = drawData(g);
//将生成的验证码放入session中 便于跟用户提交的验证码比较
session.setAttribute("validateCode", validateCode);
System.out.println(validateCode);
//在验证码中写入线条
drawLine(g, 50);
//输出到页面
//输出流
OutputStream out = response.getOutputStream();
//图片输出的工具类
//write 将图片通过输出流输出到页面中
//第一个参数 输出的内容 图片
ImageIO.write(image, "JPEG", out);
}
//画线条
public void drawLine(Graphics g,int num){
//用循环控制线条数目
//每次画一条
for(int i = 0;i<num;i++){
//给画笔设置随机颜色
g.setColor(getColor());
//线条起点x的坐标
int x1 = r.nextInt(width);
//线条起点y的坐标
int y1 = r.nextInt(height);
int x2 = r.nextInt(10);
int y2 = r.nextInt(10);
g.drawLine(x1, y1, x1+x2,y1+y2);
}
}
//写字母和数字的方法
public String drawData(Graphics g){
StringBuffer sb = new StringBuffer();
//随机取 charAt(index)
for(int i = 0;i<4;i++){
//获取随机的下标值
//修改画笔颜色
g.setColor(getColor());
int index = r.nextInt(validateString.length());
String data = String.valueOf(validateString.charAt(index));
g.drawString(data, i*15+10, 20);
sb.append(data);
}
return sb.toString();
}
//随机获取颜色
public Color getColor(){
Color color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
return color;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
验证码的生成
最新推荐文章于 2023-11-02 20:13:42 发布