java生成随机图片验证码和验证

注册

立即登录

生成验证码和验证码图片的工具类CodeUtil.java

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.awt.image.RenderedImage;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import javax.imageio.ImageIO;

public class CodeUtil {

private static int width = 120;// 定义图片的width

private static int height = 45;// 定义图片的height

private static int codeCount = 4;// 定义图片上显示验证码的个数

private static int xx = 22;

private static int fontHeight = 35;

private static int codeY =35;

private static char[] codeSequence = { ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’,

‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’,‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’,

‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’,

‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’,

‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ };

/**

  • 生成一个map集合

  • code为生成的验证码

  • codePic为生成的验证码BufferedImage对象

  • @return

*/

public static Map<String,Object> generateCodeAndPic() {

// 定义图像buffer

BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics gd = buffImg.getGraphics();

// 创建一个随机数生成器类

Random random = new Random();

// 将图像填充为白色

gd.setColor(Color.WHITE);

gd.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定。

Font font = new Font(“Fixedsys”, Font.BOLD, fontHeight);

// 设置字体。

gd.setFont(font);

// 画边框。

gd.setColor(Color.BLACK);

gd.drawRect(0, 0, width - 1, height - 1);

// 随机产生50条干扰线,使图象中的认证码不易被其它程序探测到。

gd.setColor(Color.BLACK);

for (int i = 0; i < 50; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

gd.drawLine(x, y, x + xl, y + yl);

}

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

StringBuffer randomCode = new StringBuffer();

int red = 0, green = 0, blue = 0;

// 随机产生codeCount数字的验证码。

for (int i = 0; i < codeCount; i++) {

// 得到随机产生的验证码数字。

String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);

// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

red = random.nextInt(255);

green = random.nextInt(255);

blue = random.nextInt(255);

// 用随机产生的颜色将验证码绘制到图像中。

gd.setColor(new Color(red, green, blue));

gd.drawString(code, (i + 1) * xx, codeY);

// 将产生的四个随机数组合在一起。

randomCode.append(code);

}

Map<String,Object> map =new HashMap<String,Object>();

//存放验证码

map.put(“code”, randomCode);

//存放生成的验证码BufferedImage对象

map.put(“codePic”, buffImg);

return map;

}

//测试

public static void main(String[] args) throws Exception {

//创建文件输出流对象

OutputStream out = new FileOutputStream(“D://img/”+System.currentTimeMillis()+“.jpg”);

Map<String,Object> map = CodeUtil.generateCodeAndPic();

ImageIO.write((RenderedImage) map.get(“codePic”), “jpeg”, out);

System.out.println(“验证码的值为:”+map.get(“code”));

}

}

后台生成验证和效验代码

/**

  • 生成验证码

  • @param req

  • @param resp

*/

@RequestMapping(value=“/getCode”)

@ResponseBody

public void getCode(HttpServletRequest req, HttpServletResponse resp) {

// 调用工具类生成的验证码和验证码图片

Map<String, Object> codeMap = CodeUtil.generateCodeAndPic();

// 将四位数字的验证码保存到Session中。

HttpSession session = req.getSession();

session.setAttribute(“code”, codeMap.get(“code”).toString());

// 禁止图像缓存。

resp.setHeader(“Pragma”, “no-cache”);

resp.setHeader(“Cache-Control”, “no-cache”);

resp.setDateHeader(“Expires”, -1);

resp.setContentType(“image/jpeg”);

// 将图像输出到Servlet输出流中。

ServletOutputStream sos;

try {

sos = resp.getOutputStream();

ImageIO.write((RenderedImage) codeMap.get(“codePic”), “jpeg”, sos);

sos.close();

} catch (IOException e) {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
**

[外链图片转存中…(img-ky2vOxK8-1715442668838)]

[外链图片转存中…(img-9YANmMoQ-1715442668838)]

[外链图片转存中…(img-NHUdZgIO-1715442668838)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 图片滑动验证码的示例代码,使用 Java Swing 库实现: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class ImageSliderVerificationCode extends JFrame { private static final long serialVersionUID = 1L; private final int WIDTH = 400; private final int HEIGHT = 300; private final int BLOCK_SIZE = 50; private Image bgImage; private Image blockImage; private int blockX; private int blockY; private int mouseX; private int mouseY; private boolean isDragging; public ImageSliderVerificationCode() { setTitle("Image Slider Verification Code"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); bgImage = new ImageIcon("background.jpg").getImage(); blockImage = new ImageIcon("block.png").getImage(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.getX() >= blockX && e.getX() <= blockX + BLOCK_SIZE && e.getY() >= blockY && e.getY() <= blockY + BLOCK_SIZE) { isDragging = true; mouseX = e.getX(); mouseY = e.getY(); } } public void mouseReleased(MouseEvent e) { isDragging = false; if (blockX >= WIDTH - BLOCK_SIZE) { JOptionPane.showMessageDialog(null, "Verification passed!"); System.exit(0); } else { blockX = 0; blockY = new Random().nextInt(HEIGHT - BLOCK_SIZE); repaint(); } } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { if (isDragging) { blockX += e.getX() - mouseX; blockY += e.getY() - mouseY; if (blockX < 0) { blockX = 0; } if (blockX > WIDTH - BLOCK_SIZE) { blockX = WIDTH - BLOCK_SIZE; } if (blockY < 0) { blockY = 0; } if (blockY > HEIGHT - BLOCK_SIZE) { blockY = HEIGHT - BLOCK_SIZE; } mouseX = e.getX(); mouseY = e.getY(); repaint(); } } }); } public void paint(Graphics g) { g.drawImage(bgImage, 0, 0, null); g.drawImage(blockImage, blockX, blockY, null); } public static void main(String[] args) { ImageSliderVerificationCode verCode = new ImageSliderVerificationCode(); verCode.setVisible(true); } } ``` 此代码将生成一个包含背景图片和滑块图片的窗口。当用户按住滑块图片并拖动它时,窗口将显示移动后的滑块图片。如果用户将滑块图片拖动到窗口的右边缘,则显示验证通过的消息并退出程序。否则,滑块图片将被重置到窗口的左侧,并随机在窗口的垂直方向上移动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值