Generate random verification code with java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("all")
@WebServlet("/code.jpg")
public class CodeServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 图片宽度和高度
int width = 130;
int height = 39;
// 创建用于保存图片信息的缓冲区对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics(); // 获取画笔
g.setColor(new Color(191, 234, 198)); // 设置画笔颜色
g.fillRect(0, 0, width, height); // 填充背景颜色
g.setColor(new Color(0, 0, 255)); // 重新设置画笔颜色
g.drawRect(0, 0, width - 1, height - 1); // 绘制边框
Random r = new Random(); // 创建随机数对象
// 添加干扰线
for (int i = 0; i < 15; i++) {
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255))); // 重新设置画笔颜色
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
}
// 生成验证码的数据
String data = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
int length = data.length();
String capstr = "";
g.setFont(new Font("宋体", Font.BOLD, 35)); // 设置字体
for (int i = 0; i < 4; i++) {
int index = r.nextInt(length);
String str = data.charAt(index) + "";
capstr += str;
g.setColor(new Color(r.nextInt(200), r.nextInt(200), r.nextInt(200))); // 重新设置画笔颜色
g.drawString(str, 10 + (i * 28), 30); // 将字符写入图片
}
System.out.println(capstr);
// 将生成的验证码存储到session中,以便在注册时,在后台进行校验
HttpSession session = request.getSession();
session.setAttribute("code", capstr);
g.dispose(); // 释放资源
response.setContentType("image/jpg"); // 设置响应类型
OutputStream strm = response.getOutputStream(); // 输出流
ImageIO.write(image, "jpg", strm); // 将图片写到输出流
strm.close(); // 关闭输出流
}
}