zoukankan      html  css  js  c++  java
  • springmvc java的验证码的小程序

    记录下自己的验证码小工具,留待以后复用。

    字符库代码

    public class SecurityCode {
    
        public enum SecurityCodeLevel {
            Simple, Medium, Hard
        };
    
        public static String getSecurityCode() {
            return getSecurityCode(4, SecurityCodeLevel.Medium, false);
        }
    
        public static String getSecurityCode(int length, SecurityCodeLevel level,
                boolean isCanRepeat) {
            // 随机抽取len个字符
            int len = length;
            // 字符集合(除去易混淆的数字0、数字1、字母l、字母o、字母O)
            char[] codes = { '1', '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', 'A', 'B',
                    'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
                    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
            // 根据不同的难度截取字符数组
            if (level == SecurityCodeLevel.Simple) {
                codes = Arrays.copyOfRange(codes, 0, 9);
            } else if (level == SecurityCodeLevel.Medium) {
                codes = Arrays.copyOfRange(codes, 0, 33);
            }
            // 字符集合长度
            int n = codes.length;
            // 抛出运行时异常
            if (len > n && isCanRepeat == false) {
                throw new RuntimeException(
                        String.format(
                                "验证码长度大于字符库长度,请改小验证码位数参数 length",
                                len, level, isCanRepeat, n));
            }
    
            // 存放抽取出来的字符
            char[] result = new char[len];
    
            // 判断能否出现重复的字符
            if (isCanRepeat) {
                for (int i = 0; i < result.length; i++) {
                    // 索引 0 and n-1
                    int r = (int) (Math.random() * n);
    
                    // 将result中的第i个元素设置为codes[r]存放的数值
                    result[i] = codes[r];
                }
            } else {
                for (int i = 0; i < result.length; i++) {
                    // 索引 0 and n-1
                    int r = (int) (Math.random() * n);
    
                    // 将result中的第i个元素设置为codes[r]存放的数值
                    result[i] = codes[r];
    
                    // 必须确保不会再次抽取到那个字符,因为所有抽取的字符必须不相同。
                    // 因此,这里用数组中的最后一个字符改写codes[r],并将n减1
                    codes[r] = codes[n - 1];
                    n--;
                }
            }
            return String.valueOf(result);
        }
    }

    画图片代码

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.Random;
    import com.sun.image.codec.jpeg.ImageFormatException;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    
    public class SecurityImage {
    
        public static BufferedImage createImage(String securityCode) {
    
            // 验证码长度
            int codeLength = securityCode.length();
            // 字体大小
            int fSize = 15;
            int fWidth = fSize + 1;
            // 图片宽度
            int width = codeLength * fWidth + 6;
            // 图片高度
            int height = fSize * 2 + 1;
    
            // 图片
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
    
            // 设置背景色
            g.setColor(Color.WHITE);
            // 填充背景
            g.fillRect(0, 0, width, height);
    
            // 设置边框颜色
            g.setColor(Color.LIGHT_GRAY);
            // 边框字体样式
            g.setFont(new Font("Arial", Font.BOLD, height - 2));
            // 绘制边框
            g.drawRect(0, 0, width - 1, height - 1);
    
            // 绘制噪点
            Random rand = new Random();
            for (int i = 0; i < codeLength * 6; i++) {
                int xs = rand.nextInt(width);
                int ys = rand.nextInt(height);
                // 绘制1*1大小的矩形
                randColor(g, rand);
                g.drawRect(xs, ys, 1, 1);
    
            }
    
            // 干扰线
            for (int i = 0; i < 10; i++) {
                int xs = rand.nextInt(width);
                int ys = rand.nextInt(height);
                int xe = xs + 10;
                int ye = ys + 10;
                randColor(g, rand);
                g.drawLine(xs, ys, xe, ye);
            }
    
            // 绘制验证码
            int codeY = height - 10;
            // 设置字体颜色和样式
            g.setFont(new Font("Georgia", Font.BOLD, fSize));
            for (int i = 0; i < codeLength; i++) {
                randColor(g, rand);
                g.drawString(String.valueOf(securityCode.charAt(i)), i * 16 + 5,
                        codeY);
            }
            // 关闭资源
            g.dispose();
    
            return image;
        }
    
        /**
         * 随机色
         * 
         * @param g
         * @param rand
         */
        private static void randColor(Graphics g, Random rand) {
            int red = 0, green = 0, blue = 0;
            red = rand.nextInt(255);
            green = rand.nextInt(255);
            blue = rand.nextInt(255);
            g.setColor(new Color(red, green, blue));
        }
    
        public static ByteArrayInputStream getImageAsInputStream(String securityCode) {
    
            BufferedImage image = createImage(securityCode);
            return convertImageToStream(image);
        }
    
        private static ByteArrayInputStream convertImageToStream(BufferedImage image) {
    
            ByteArrayInputStream inputStream = null;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);
            try {
                jpeg.encode(image);
                byte[] bts = bos.toByteArray();
                inputStream = new ByteArrayInputStream(bts);
            } catch (ImageFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return inputStream;
        }
    }
    原创博文,未经许可不得转载,转载请注明出处。
  • 相关阅读:
    React 学习笔记
    需要充实自己的课外东西
    近期计划
    测试TinyMCE编辑器
    我的第二篇博客园随笔
    博客已搬运至https://wz71014q.github.io
    关于HTTPS通信机制的笔记
    JS中数组的一些笔记
    Three学习之曲线
    Three入门学习笔记整理
  • 原文地址:https://www.cnblogs.com/Think-007/p/7510025.html
Copyright © 2011-2022 走看看