Java图片验证码工具类_shyの程序猿的博客-程序员宅基地_java 验证码图片工具类

技术标签: Java  java  

图片验证码工具类

/**
 * @desc: 图片验证码
 * @author: shy
 * @date: 2020/12/9 10:49
 */
@Service
public class CaptchaService {
    

    @Autowired
    protected SessionService sessionService;

    /**
     * 定义图片的width
     */
    private int width = 90;
    /**
     * 定义图片的height
     */
    private int height = 20;
    /**
     * 定义图片上显示验证码的个数
     */
    private int codeCount = 4;
    private int xx = 15;
    private int fontHeight = 18;
    private int codeY = 16;
    char[] codeSequence = {
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
            'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
            '3', '4', '5', '6', '7', '8', '9' };
    private final Color[] ColorOptions = new Color[] {
     Color.BLACK, Color.BLUE,
            Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
            Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK,
            Color.RED, new Color(165, 42, 42), new Color(210, 105, 30),
            new Color(220, 20, 60), new Color(255, 99, 71),
            new Color(128, 0, 128), new Color(0, 0, 128) };

    public ByteArrayOutputStream picture(String sessionId, HttpServletResponse response) throws Exception {
    
        // 定义图像buffer
        BufferedImage buffImg = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // Graphics2D gd = buffImg.createGraphics();
        // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
        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);
        // 随机产生20条干扰线,使图象中的认证码不易被其它程序探测到。
        gd.setColor(Color.BLACK);
        for (int i = 0; i < 20; 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 - 1)]);
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            // red = random.nextInt(255);
            // green = random.nextInt(255);
            // blue = random.nextInt(255);
            // 用随机产生的颜色将验证码绘制到图像中。
            // gd.setColor(new Color(red, green, blue));
            gd.setColor(ColorOptions[random.nextInt(ColorOptions.length)]);
            gd.drawString(code, (i + 1) * xx, codeY);
            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        //验证码数据存储redis,为校验做准备
        sessionService.saveCachePicCode(sessionId, randomCode.toString());
        // 禁止图像缓存。
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        // 将图像输出到Servlet输出流中。
        ByteArrayOutputStream sos = new ByteArrayOutputStream();
        ImageIO.write(buffImg, "jpeg", sos);
        sos.close();
        return sos;
    }
}

返回的结果为字节数组输出流ByteArrayOutputStream,对其进行Base64加密,将字符串结果返回给前端

public String picture(String sessionId, HttpServletResponse response) throws Exception {
    
        ByteArrayOutputStream sos = captchaService.picture(sessionId, response);
        return Base64.getEncoder().encodeToString(sos.toByteArray());
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shy_1762538422/article/details/111831555

智能推荐

Mysql系列课程--第二章 约束 自增主键_极客_杨振的博客-程序员宅基地

一.约束(保证数据的合理性) 1.not Null 非空约束,不能为null 2.unique 唯一约束 , 不能重复 3.primary key 主键约束 ,唯一标识这条数据 4.foreign key 外键约束,用来连接两张表,这张表的外键一定是另一张表的主键 5.check 检查约束,判断数据是否合理 6.default 默认约束 ,如果你不设置,则插入默认值二.

istio过滤sidecar的流量劫持_序冢--磊的博客-程序员宅基地_istio流量劫持

首先查看yaml文件中iptables被过滤掉的用户uidinitContainers: - args: - istio-iptables - -p - "15001" - -z - "15006" - -u - "1337" - -m - REDIRECT - -i - '*' - -x

linux下Android开发环境的udev设置_lail3344的博客-程序员宅基地

关于adb 连接 devices的问题http://www.google.com/support/forum/p/android/thread?tid=08945730bbd7b22b&hl=en详细解释了udev的原理喝如何设置ruleshi folks.  ifound this info to be helpful, although there was

android 图片文字布局,Android代码实现图片和文字上下布局_晒月亮的孩子的博客-程序员宅基地

在Android开发中经常会需要用到带文字和图片的button,下面来给大家介绍使用radiobutton实现图片和文字上下布局或左右布局。代码很简单就不给大家多解释了。布局文件很简单,用来展示RadioBUtton的使用方法。android:layout_width="match_parent"android:layout_height="match_parent"android:orienta...

java 与jni转码_Android第十五课 Jni自带的iconv库不支持GBK转码_周开拓的博客-程序员宅基地

场景说明NDK环境下使用sqlite3存储用户数据,存储的是UTF-8格式,读取数据库,转换为GBK显示中文。结论Android自带的iconv库不支持GBK转码,也不支持GBK2312的转码测试步骤如下使用Android自带的iconv库,引入该库LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := mylibLOCAL...

ES6 Promise()讲解,promise的常用方法_淡淡的云彩恋歌的博客-程序员宅基地

ES6 Promise 先拉出来遛遛复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受。那么第一个问题来了,Promise是什么玩意呢?是一个类?对象?数组?函数?别猜了,直接打印出来看看吧,console.dir(Promise),就这么简单粗暴。 这么一看就明白了,Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型...

随便推点

NLog配置分享_weixin_33859665的博客-程序员宅基地

新建一个文件命名为NLog.Config,然后添加如下代码&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&amp;lt;nlog xmlns=&quot;http://www.nlog-project.org/schemas/NLog.xsd&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&amp;gt

java软件textp_阅读下列程序,请写出该程序的功能。import java.applet.*; import javax.swing.*;import java.awt.*; import ja..._中一贝爷的博客-程序员宅基地

阅读下列程序,请写出该程序的功能。import java.applet.*; import javax.swing.*;import java.awt.*; import java.awt.event.*;public class Test extends Applet implements ActionListener {JTextField text;int r; JPanel panel;p...

沟通技巧——共情能力_归来少年Plus的博客-程序员宅基地

今天和老大聊天,发现一个问题很重要.谈话时,要找到你与别人的共情能力,什么是共情能力?共情能力指的是一种能设身处地体验他人处境,从而达到感受和理解他人情感的能力。想要说服别人,让别人认同你,这种能力很重要....

Oracle数据库优化模式,[数据库]Oracle 概述优化器模式_猩蕉硕的博客-程序员宅基地

[数据库]Oracle 概述优化器模式02012-09-09 01:00:05http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/CBOI/Default.aspx优化器是负责确定最有效的方式执行和产生结果的一个程序。根据表的大小、行的数量、数据块的密度、索引列和其他一些因素,可能有很多不同方式来...

oracle取较小数,oracle 取小数位数_13134722143的博客-程序员宅基地

select ltrim('124532.62879'-floor('124532.62879'),'0.') from dual;select length(66695)from dual;这两条SQL结合起来,就可以查询出小数点后边部分的小数位数、在Oracle中很经典,也很实用!下面这个做法也还是经典(推荐使用):比如有一张表的某字段是 number(10,4)的,但是大多数是3位小数,如...

掘金量化 | 短周期量价策略(附源码)_量化密码库的博客-程序员宅基地_掘金量化

可能不少朋友都有阅读过国泰君安《基于短周期价量特征的多因子选股体系》这篇研报,对其内多达191个量价因子印象深刻。该研报是在2017年中旬发布的,时至今日已过去四年时光,为此大家可能会好奇,这些因子“尚能饭否”? ​为此,基于单因子方式,我们做了一些简单测试。 ​一、策略逻辑简述: ​基于研报内的量价因子,做多单因子前N只股票,周频持仓。 ​我们测试了Alpha001至Alpha050这50个因子,其中Alpha007因子在今年表现较为优越。其因子定义分为如下: ​Alp

推荐文章

热门文章

相关标签