@RequestMapping(value = "captcha.jpg")
public void captcha(HttpServletRequest request, HttpServletResponse response) {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
int width = 150, height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics2D g2d = image.createGraphics();
g2d.setStroke( new BasicStroke(1.5f));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 设定背景色
GradientPaint gradientPaint =new GradientPaint(-50, height/2,Color.black, width, height, Color.white,false);
g2d.setPaint(gradientPaint);
g2d.fillRect(0, 0, width, height);
g2d.setFont(new Font("楷体", Font.PLAIN, 45));
Random random = new Random();
for (int i = 0; i < 15; i++) {
g2d.setColor(new Color(10, 10, 10));
int x = random.nextInt(image.getWidth());
int y = random.nextInt(image.getHeight());
Line2D lin = new Line2D.Float(0, y, x + random.nextInt(image.getWidth()), y + random.nextInt(image.getHeight()));
g2d.draw(lin);
}
// 取随机产生的认证码(4位数字)
String code = "";
for (int i = 0; i < 4; i++) {
String rand = "";
if (random.nextInt(100) < 80)
rand = String.valueOf(random.nextInt(10));
else
rand = ((char) ('A' + (char) random.nextInt(26))) + "";
code += rand;
// 将认证码显示到图象中
g2d.setColor(new Color(0, 0, 0));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g2d.drawString(rand, 20 * i + 45, 40);
}
// 将认证码存入SESSION
request.getSession().setAttribute(Constant.VALID_CODE, code);
// 图象生效
g2d.dispose();
// 输出图象到页面
try {
ImageIO.write(image, "PNG", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
JAVA 仿 kaptcha 生成验证码
最新推荐文章于 2024-10-14 14:51:34 发布