千家信息网

java怎么实现随机验证码图片生成

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"java怎么实现随机验证码图片生成",在日常操作中,相信很多人在java怎么实现随机验证码图片生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"jav
千家信息网最后更新 2026年11月03日java怎么实现随机验证码图片生成

这篇文章主要介绍"java怎么实现随机验证码图片生成",在日常操作中,相信很多人在java怎么实现随机验证码图片生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java怎么实现随机验证码图片生成"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

具体内容如下

1.controller

 /**     * 获取随机数验证码图片     *     * @param request  HttpServletRequest     * @param response HttpServletResponse     */    @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)    public void getRandomCode(HttpServletRequest request, HttpServletResponse response) {        baseService.getRandomCode(request, response);}

2.service

void getRandomCode(HttpServletRequest request, HttpServletResponse response);

3.serviceImpl

@Autowired private RedisTemplate redisTemplate;    @Autowired    private CodeImageUtils codeImageUtils;    /**     *  获取随机数验证码图片     */    @Override    public void getRandomCode(HttpServletRequest request, HttpServletResponse response) {        try {            // 设置输出类型为图片            response.setContentType("image/jpeg");            // 生成随机码            String verificationCode = codeImageUtils.getRandomCode();            // 背景颜色与字符颜色            Color color = codeImageUtils.getRandomColor();            Color reverseColor = codeImageUtils.getReverseColor(color);            //创建一张彩色的图片            BufferedImage bi = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);            Graphics2D graphics = bi.createGraphics();            //设置字体            graphics.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));            graphics.setColor(color);            //绘制背景            graphics.fillRect(0, 0, 100, 30);            graphics.setColor(reverseColor);            //绘制字符            graphics.drawString(verificationCode, 18, 20);            //绘制最多50个随机噪点//绘制最多50个随机噪点            Random random = new Random();            int n = random.nextInt(50);            for (int i = 0; i < n; i++) {                graphics.drawRect(100, 30, 1, 1);            }            // 放到redis中 sessionId:code,过期时间60s            redisTemplate.opsForValue().set(request.getSession().getId(),verificationCode,60, TimeUnit.SECONDS);            //输出到客户端            ServletOutputStream sos = response.getOutputStream();            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);            encoder.encode(bi);            sos.flush();        }catch (Exception ex){            log.error("生成验证码失败!",ex);        }    }

4.CodeImageUtils

@Componentpublic class CodeImageUtils {    @Autowired    RedisTemplate redisTemplate;    /**     * 生成4位随机的验证码字符串     *     * @return     */    public  String getRandomCode() {        // 通过random生成4位随机数字码        Random random = new Random();        StringBuilder rs = new StringBuilder();        for (int i = 0; i < 4; i++) {            rs.append(random.nextInt(10));        }        return rs.toString();    }    /**     * 生成随机的颜色     *     * @return     */    public  Color getRandomColor() {        Random random = new Random();        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));    }    /**     * 获取某颜色的反色     * @param color     * @return     */    public  Color getReverseColor(Color color) {        return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue());    }    /**     * 校验     * @param code     * @return     */    public boolean valid(HttpServletRequest request,String code){        // 获取缓存的code       Object cacheCode =  redisTemplate.opsForValue().get(request.getSession().getId());       if(cacheCode ==null){           return false;       }       return code.equals(cacheCode);    }}

5.请求该接口


6.ImageIO

JPEGCodec这个在高版本的jdk中过期了,替换为ImageIO

//输出到客户端            ServletOutputStream sos = response.getOutputStream();            /*JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);            encoder.encode(bi);*/            ImageIO.write(bi, "PNG", sos);            sos.flush();

7.sessionId不一致

以上代码在单节点部署情况下暂时没发现什么问题,但是在多节点部署时会出现sessionId不一致的问题,(别问我怎么知道的…踩坑使我进步)。

解决方案为使用@EnableRedisHttpSession注解来开启session共享。

新增依赖

            org.springframework.session            spring-session-data-redis            2.1.12.RELEASE

新增配置

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400)

到此,关于"java怎么实现随机验证码图片生成"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

生成 图片 验证 颜色 学习 字符 问题 随机数 输出 客户 客户端 更多 背景 节点 帮助 实用 一致 接下来 上代 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 互联网科技有限公司图片 深圳科技互联网 北京互联网科技 广州宏创互联网科技 北京互联网络科技有限公司 互联网女皇 腾讯科技 新华互联网科技校企合作 互联网科技创新企业排名 老年人脱离互联网科技的作文 富国互联网科技创新基金 华服互联网科技官网 佳云科技和互联网广告 成都互联网科技公司工作好不好 伊宁互联网科技做什么的 江苏苏星互联网科技有限公司 互联网界的黑科技 上海万顺科技互联网有限公司招聘 美国五大互联网科技公司市值多少 科技互联网专业工作会议发言稿 小米移动互联网科技园 鸠鸠互联网科技 互联网科技开发公司 上海挚品互联网科技 南山科技园互联网公司有哪些 互联网科技产业特征 科技大学互联网 南博望互联网科技有限公司 中国互联网公司的科技投入 长沙易易互联网科技有限公司
0