0.注意事项:

  1. 图片格式(宽、高)、干扰线及数量在工具类的成员变量配置
  2. 验证码验证。验证码生成后是存储在session中的,使用相同的属性名(类似key)即可取出,然后进行比对

1. 验证码生成工具类

package com.jbp.util;import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;/*** @ClassName: OptimizeVerificationCodeUtil* @description: 验证码生产工具类优化版* @author: JiangBeiPing* @create: 2021-05-12 10:12* @Version: 1.0**/
public class OptimizeVerificationCodeUtil {/*** 验证码图片*/private BufferedImage image;/*** 验证码*/private String verificationCode;/*** 生成的验证码的类型(目前的业务类型只需要数字类型)*/private static char[] codeSequence = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};/*** 存入Session的验证码的属性名称*/public static final String SESSION_VERIFICATION_CODE = "validateCode";/*** 设置验证码图片的宽度*/private static final int WIDTH = 600;/*** 设置验证码图片的高度*/private static final int HEIGHT = 200;/*** 设置验证码字符的个数*/private static final int CODE_COUNT = 4;/*** 设置验证码图片干扰线的数量*/private static final int INTERFERING_LINE_COUNT = 160;private OptimizeVerificationCodeUtil() {// 初始化过程中生产并渲染验证码图片init();}/*** 对外提供的本工具类的实例** @return 工具类的实例*/public static OptimizeVerificationCodeUtil instance() {return new OptimizeVerificationCodeUtil();}/*** 获取验证码图片** @return 验证码图片*/public BufferedImage getImage() {return this.image;}/*** 获取验证码** @return 验证码*/public String getVerificationCode() {return this.verificationCode;}private void init() {// 在内存中创建验证码图片BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics2D graphics = bufferedImage.createGraphics();try {// 随机数生成器类Random random = new Random();// 图像背景设置为白色graphics.setColor(Color.white);graphics.fillRect(0, 0, WIDTH, HEIGHT);// 创建字体,字体的大小应该根据图片的高度来定Font font = new Font("Fixedsys", Font.PLAIN, HEIGHT - 2);// 设置字体graphics.setFont(font);// 画边框graphics.setColor(Color.BLACK);graphics.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到for (int i = 0; i < INTERFERING_LINE_COUNT; i++) {// 每条干扰线都设置为随机颜色graphics.setColor(getRandomColor());int x2 = random.nextInt(WIDTH);int y2 = random.nextInt(HEIGHT);int x1 = random.nextInt(WIDTH);int y1 = random.nextInt(HEIGHT);graphics.drawLine(x2, y2, x2 + x1, y2 + y1);}// randomCode用于保存随机产生的验证码,以便用户登录后进行验证StringBuilder randomCode = new StringBuilder();int x = WIDTH / (CODE_COUNT + 1);int codeY = HEIGHT - 4;// 随机产生 codeCount 数字的验证码for (int i = 0; i < CODE_COUNT; i++) {// 获取随机产生的验证码数字String strRand = String.valueOf(codeSequence[random.nextInt(10)]);// 用随机产生的颜色将验证码绘制到图像中graphics.setColor(getRandomColor());graphics.drawString(strRand, (i + 1) * x, codeY);// 将产生的四个随机数组合在一起randomCode.append(strRand);}// 赋值验证码this.verificationCode = String.valueOf(randomCode);// 赋值图像this.image = bufferedImage;} finally {// 不关闭的话有OOM风险graphics.dispose();}}/*** 生成随机颜色* @return 随机颜色*/private static Color getRandomColor() {Random random = new Random();return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));}}

2. Controller层

package com.jbp.controller;import com.jbp.util.OptimizeVerificationCodeUtil;
import com.jbp.util.VerificationCodeUtil;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;/*** @ClassName: VerificationCodeController* @description: 验证码Controller* @author: JiangBeiPing* @create: 2021-05-11 11:28* @Version: 1.0**/
@RequestMapping("/verification")
@RestController
@Slf4j
public class VerificationCodeController {@RequestMapping(value = "/getSecurityCode", produces = {"application/json;charset=UTF-8"},method = RequestMethod.GET)public void getSecurityCode(HttpServletResponse response, HttpServletRequest request){// 通知浏览器不要缓存response.setHeader("Expires","-1");response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "-1");// 将验证码输入到session中,用来验证OptimizeVerificationCodeUtil optimizeVerificationCodeUtil = OptimizeVerificationCodeUtil.instance();String verificationCode = optimizeVerificationCodeUtil.getVerificationCode();request.getSession().setAttribute(OptimizeVerificationCodeUtil.SESSION_VERIFICATION_CODE,verificationCode);try {ImageIO.write(optimizeVerificationCodeUtil.getImage(), "jpg", response.getOutputStream());} catch (IOException e) {e.printStackTrace();}}}

3. 效果测试

ps:无视水印,问就是在划水

Java实现随机验证码和验证码图片渲染功能相关推荐

  1. java实现随机字母数字验证码

    生成随街验证码 VerifyCode 工具类 package com.meeno.common.cerifycode;import javax.imageio.ImageIO; import java ...

  2. Java实现添加文字水印、图片水印功能

    Java实现添加水印功能 添加水印 Java 2D API介绍 绘制文字水印 绘制图片水印 循环添加文字水印 添加水印 为图片添加水印的主要作用是保护图片版权,防止图片被未经授权的人使用或传播.为图片 ...

  3. Java Word中的文本、图片替换功能

    Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...

  4. java斗地主随机发牌_java实现斗地主发牌功能

    本文实例为大家分享了java实现斗地主发牌的具体代码,供大家参考,具体内容如下 参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色:三名玩家,其中地主比其他玩家多3张牌) 代码如下: ...

  5. JAVA后端生成类似于分享海报图片的功能的实现

    首先确定一下我们需要实现的效果图 案例图 核心代码如下: import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D ...

  6. Java实现点击中文文字图片验证码

    Java实现点击中文文字图片验证码 环境条件 JDK1.8 MAVEN-3.3 spring-boot-2.1.17.RELEASE Redis 注意事项 Java AWT在背景图片上绘写文件时候设置 ...

  7. java 验证码 算术_java生成图形验证码(算数运算图形验证码 + 随机字符图形验证码)...

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  8. 用Python生成随机的中文验证码图片

    大家都在 Python论坛里讨论.交流,你还在等什么!赶快加入! 在登录很多网站的时候,他们已经不在使用简单的英文和数字的验证码,为了防止恶心注册和群发软件的侵袭,现在都开始使用中文的验证码了. 今天 ...

  9. java实现图片验证码_JAVA实现图片验证码

    一.创建image工具类 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; i ...

  10. Java 图片验证码/图形验证码 亲测

    Java 图片验证码/图形验证码 1. Maven包 pom.xml 2. 图片验证码工具类 3. 生成验证码,图片验证码 和 验证接口 4. 验证页面 index.html 1. Maven包 po ...

最新文章

  1. 高考大数据:哪个省才是高考地狱模式?结论和想象不太一样
  2. 我的第二故乡 – 广州
  3. Special Numbers 进制(1100)
  4. 连接池,数据库连接池
  5. Ubuntu Linux下使用锐捷认证的方法
  6. 履带式机器人与轮式机器人的异同分析
  7. MaxDEA如何计算DEA-Malmquist指数
  8. BZOJ1579: [Usaco2009 Feb]Revamping Trails 道路升级
  9. Scrapy框架之Spiders类理解
  10. python实现人工智能识别水果
  11. js中RGB与十六进制颜色转换
  12. 软件测试中如何测试算法?
  13. Android 技术淘金者:杨丰盛
  14. 2.股票入门课(新版)
  15. 手把手教你搭建K3S产线集群
  16. Oracle笔记(六) 多表查询
  17. 孙鑫java基础视频教程_孙鑫老师JAVA无难事视频教程 最适合java入门学习打基础的课程 附源码讲义 12课...
  18. 如何有效的利用思维导图网站优化记录?
  19. JavaWeb:shiro入门小案例
  20. 《量化金融R语言初级教程》一1.2 对英国房屋价格建模并预测

热门文章

  1. 专精特新企业数据库-专精特新企业名单及汇总
  2. java ftpclient prompt,一个JAVA FTP客户端制作的收获
  3. U盘中毒后被隐藏的文件夹无法隐藏选项无法取消
  4. 百度离线地图瓦片图制作
  5. r5驱动 索尼exmor_为画质插上翅膀 详解索尼Exmor R CMOS
  6. ActiveSync用蓝牙接口PC与WM6同步
  7. Windows7 关闭UAC_频繁提示的权限放行窗口
  8. 梦幻西游这么火, Python也不甘示弱, Python写游戏辅助软件!
  9. Linux-千兆网卡驱动实现机制浅析
  10. macbook设置充电上限