首页 > 其他分享 >图片数字验证码生成

图片数字验证码生成

时间:2023-08-07 18:47:35浏览次数:45  
标签:数字 int random 验证码 private 生成 nextInt fc String

生成验证码

  • controller层
@GetMapping("/image")
    public String image(HttpServletRequest request, HttpServletResponse response){
        RandomCodeTemp randomCodeTemp = new RandomCodeTemp();
        randomCodeTemp.getRandomCode(request,response);
        return String.valueOf(request.getSession());
    }
  • 实现层
public class RandomCodeTemp {
    private Logger logger;
    /**
     * 图片流参数
     */
    // 放到session中的key
    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";
    // 随机产生数字和字母组合的字符串
    private String randString = "1234568789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // 图片宽 越小图片文字越大(当stringNum超过5时, width就需要放大,否则可能出现显示不全问题,75对应 4和5位验证码,90对应6位验证码)
    private int width = 75;
    // 图片高 越小图片文字越大
    private int height = 20;
    // 干扰线的数量
    private int lineSize = 2;
    // 随机产生字符串的数量
    private int stringNum = 4;
    // 验证码背景RGB参数
    private Color backgroundColor = Color.white;
    // 验证码字体
    private Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, 18);
    // 干扰线字体
    private Font drawFont = new Font("Fixedsys", Font.CENTER_BASELINE, 18);
    // 安全的随机数对象
    private SecureRandom random = new SecureRandom();

    /**
     * 获得干扰线字体
     * @return 干扰线字体
     */
    private Font getFont(){
        return drawFont;
    }
    /**
     * 获得颜色
     * @param fc
     * @param bc
     * @return
     */
    private Color getRandColor(int fc, int bc){
        if (fc > 255){
            fc = 255;
        }
        if (bc > 255){
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r,g,b);
    }
    /**
     * 绘制干扰线
     * @param g
     */
    private void drawLine(Graphics g){
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int x1 = random.nextInt(13);
        int y1 = random.nextInt(13);
        g.drawLine(x, y, x + x1,y + y1);
    }

    /**
     * 获取随机字符
     * @param num
     * @return
     */
    public String getRandomString(int num){
        return String.valueOf((randString.charAt(num)));
    }

    /**
     * 绘制字符串
     * @param g
     * @param randomString
     * @param i
     * @return
     */
    private String drawString(Graphics g, String randomString,int i){
        g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
        String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
        randomString += rand;
        // 设置字符水平移动
        // g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(rand , 13 * i, 16);
        return randomString;
    }
    /**
     * 获得随机的字符
     * @param request
     * @param response
     */
    public void getRandomCode(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        // BUfferedImage类是具有缓存区的Image类,image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        // 产生Image对象的GRaphics对象,该对象可以在图像上进行各种绘制操作
        Graphics g = image.getGraphics();
        // 设置背景透明
        g.setColor(backgroundColor);
        // 图片大小
        g.fillRect(0, 0, width, height = height);
        // 字体大小
        g.setFont(font);
        // 字体颜色
        g.setColor(getRandColor(110, 133));
        // 绘制干扰线
        // 判断是否需要干扰线
        if (lineSize > 0){
            for (int i=0; i<=lineSize; i++){
                drawLine(g);
            }
        }
        // 绘制随机的字符
        String randomString = "";
        for (int i = 0; i < stringNum; i++) {
            randomString = drawString(g, randomString, i);
        }
        // 将生成的随机字符串保存到session中
        session.removeAttribute(RANDOMCODEKEY);
        session.setAttribute(RANDOMCODEKEY, randomString);
        // 验证码图片布置生成
        g.dispose();
        try {
            ImageIO.write(image, "JPEG", response.getOutputStream());
        }catch (Exception e){
            logger.error("生成图片失效 ");
        }
    }
}

标签:数字,int,random,验证码,private,生成,nextInt,fc,String
From: https://www.cnblogs.com/ElloeStudy/p/17612414.html

相关文章

  • JavaSwing实现验证码功能
    JavaSwing实现验证码功能在Web应用程序开发中,验证码(CAPTCHA)是一种常见的安全措施,用于防止自动化机器人和恶意软件对网站进行攻击。本文将介绍如何使用JavaSwing来实现验证码功能,以帮助您加强Web应用程序的安全性。JavaSwing实现验证码功能一、什么是验证码?验证码是一种通过人......
  • 3D组态编辑器,零代码拖拉拽轻松构建数字孪生应用场景
    随着《中国制造2025》计划的提出,在国家数字化转型利好政策和行业发展趋势双向驱动加持下,数字孪生成为这两年数字经济发展的关键核心技术应用之一。中服云物联网开发平台组态编辑器,零代码拖拉拽轻松构建2D/3D数字孪生场景。企业生产、制造、运营等各类场景,以清晰、明确、实时的可视......
  • 科技云报道:财税数字化时代,财务人实现RPA自由了吗?
    企业数字化转型,财务是一个重要的切入点。随着数字化业务不断展开,新的系统、流程和数据源被不断引入,财务部门面临的是不断暴增的对账、处理报表、审计等日常工作。如此大的工作量,即使是经验丰富的资深财务,也难免在效率上打折扣。RPA的出现,正改变着企业财务管理模式。作为一种可靠而......
  • 数字化出行赋能--指针跃动
    指针跃动简介:l指针跃动是中国涵盖代驾运营+网约车运营两项主要核心运营项目的互联网性质企业;l指针跃动创立初衷即:为中国智慧出行行业规范标准化运营+中心化流量赋能+运营数字化管理融为一体的创新科技型公司;l指针跃动目前在全国设立有四家公司,分别为:“北京指针跃......
  • 6.6 实现卷积神经网络LeNet训练并预测手写体数字
    模型架构代码实现importtorchfromtorchimportnnfromd2limporttorchasd2lnet=nn.Sequential(nn.Conv2d(1,6,kernel_size=5,padding=2),nn.Sigmoid(),#padding=2补偿5x5卷积核导致的特征减少。nn.AvgPool2d(kernel_size=2,stride=2),nn.Conv2d(6,16,kern......
  • python re将字符串中的数字乘二
    importredefdouble(matched):value=int(matched.group('value'))returnstr(value*2)s='A23G4HFD567'print(re.sub('(?P<value>\d+)',double,s))#1.?P<value>的意思就是命名一个名字为value的组,匹配规则符合后面的/d+#......
  • Siemens 西门子S7-200SMART PLC 自编模拟量输入结构化编程并生成库
    说到模拟量,对于从事工控行业的人员并不陌生,在使用S7-200SMARTPLC模拟量时,系统自带模拟考库文件,不需要自己去编写转换程序,直接调用库文件就可以使用了,那么如何通过公式自己编写模拟量输入转换程序呢?接下来就带大家来编写。01模拟量输入转换公式02参数化模拟量输入转换程序......
  • k8s x509数字证书
    证书生成方式手动证书生成工具在使用客户端证书认证的场景下,可以通过easyrsa、openssl或cfssl等工具以手工方式生成证书。证书API可以通过certificates.k8s.ioAPI提供x509证书,用来做身份验证。证书和证书签名请求Kubernetes证书和信任包(trustbundle)API可以通过为Kub......
  • 如何在短视频中合成“虚拟数字人”?
    本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第二期,讲述围绕效率化内容生产需求,运用数字人视频合成能力,实现高效、便捷的数字人视频制作体验。欧叔|作者随着虚拟数字人技术的发展,越来越多的企业把虚拟人应用到自己的业务场景中,通过创新的内容形态,提升制播效率和智能化水......
  • js:使用LetterAvatar通过canvas实现浏览器中生成字母头像
    实现效果LetterAvatar的原理就是利用了浏览器对象canvas在线体验:https://mouday.github.io/tools/pages/letter-avatar/index.htmlLetterAvatar.js完整代码/**LetterAvatar**ArturHeinze*CreateLetteravatarbasedonInitials*basedonhttps://gist.github.co......