IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【生成图片验证码】 -> 正文阅读

[数据结构与算法]【生成图片验证码】

生成图片验证码

  1. 工具类
package com.example.demo.utils;


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

public class ValidateCodeUtil {
    protected static char[] minCh = new char[]{'0', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
            'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    static Random random = new Random();

    public static String random(int strLen) {
        return random(minCh, strLen);
    }

    public static String random(char[] charArr, int strLen) {
        if (strLen <= 0) {
            if (strLen == 0) {
                return "";
            } else {
                throw new IllegalArgumentException();
            }
        } else {
            Random random = new Random();
            StringBuilder result = new StringBuilder();

            for (int i = 0; i < strLen; ++i) {
                int num = random.nextInt(charArr.length);
                result.append(charArr[num]);
            }

            return result.toString();
        }
    }

    private static Color getRandColor() {
        Random random = new Random();
        Color[] color = new Color[10];
        color[0] = new Color(32, 158, 25);
        color[1] = new Color(218, 42, 19);
        color[2] = new Color(31, 75, 208);
        color[3] = new Color(0, 102, 182);
        color[4] = new Color(171, 0, 85);
        return color[random.nextInt(5)];
    }

    public static Font getFont() {
        Random random = new Random();
        Font[] font = new Font[]{new Font("Ravie", 1, 30), new Font("Antique Olive Compact", 1, 30), new Font("Forte", 1, 30), new Font(
                "Wide Latin", 1, 30), new Font("Gill Sans Ultra Bold", 1, 30)};
        font[5] = new Font("Courier New", 1, 30);
        return font[random.nextInt(5)];
    }

    public static byte[] render(String randomStr, int width, int height) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        BufferedImage bi = new BufferedImage(width, height, 13);
        Graphics2D g = (Graphics2D) bi.getGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Courier New", 1, 30));
        g.setColor(Color.BLACK);
        String[] str1 = new String[randomStr.length()];

        int i;
        int x;
        int y;
        for (i = 0; i < str1.length; ++i) {
            str1[i] = randomStr.substring(i, i + 1);
            y = (i + 1) % 3;
            if (y == random.nextInt(7)) {
                x = 30 - random.nextInt(7);
            } else {
                x = 30 + random.nextInt(7);
            }

            g.setColor(getRandColor());
            g.drawString(str1[i], 20 * i + 10, x);
        }

        for (i = 0; i < 100; ++i) {
            x = random.nextInt(width);
            y = random.nextInt(height);
            Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
            g.setColor(color);
            g.drawOval(x, y, 0, 0);
        }

        for (i = 0; i < 15; ++i) {
            x = random.nextInt(width);
            y = random.nextInt(height);
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
            g.setColor(color);
            g.drawLine(x, y, x1, y1);
        }

        g.dispose();
        ImageIO.write(bi, "png", out);
        return out.toByteArray();
    }
}

  1. 控制层调用
package com.example.demo.controller;

import com.example.demo.utils.ValidateCodeUtil;
import io.swagger.annotations.ApiOperation;
import org.mapstruct.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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.io.IOException;
import java.io.OutputStream;

/**
 * @Author HOUJL
 * @Date 2022/3/22
 * @Description:生成图片验证码
 */
@RestController
@RequestMapping("/qrCode")
public class QRCodeController {
    private static final Logger LOGGER = LoggerFactory.getLogger(QRCodeController.class);

    /**
     * 生成图片验证码
     *
     * @param request
     * @param response
     */
    @RequestMapping(value = "/generateQRCode", method = RequestMethod.GET)
    @ApiOperation("获取图形验证码")
    public void generateQRCode(@Context HttpServletRequest request, HttpSession session
            , @Context HttpServletResponse response) {
        LOGGER.info("generateQRCode session id: {}", session.getId());
        try {
            String code = ValidateCodeUtil.random(4);
            LOGGER.debug("生成的验证码code是:{}", code);
            byte[] codeImg = ValidateCodeUtil.render(code, 100, 50);
            // 禁止图像缓存。
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");

            // 将图像输出到Servlet输出流中。
            ServletOutputStream sos = response.getOutputStream();
            sos.write(codeImg);
            //ImageIO.write(codeImg, "jpeg", sos);
            sos.flush();
            sos.close();
        } catch (IOException e) {
            LOGGER.error("generateQRCode error : {}", e);
        }
    }
}

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:48:42  更:2022-03-24 00:51:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:34:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码