• 后端验证码工具类


    工具类:

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    
    /**
     * 验证码工具类
     * 
     * @author hsh
     */
    public class CodeUtil {
        // 图片的宽度
        private int width = 160;
        // 图片的高度
        private int height = 28;
        // 验证码字符个数
        private int codeCount = 4;
        // 验证码干扰线数
        private int lineCount = 150;
        // 验证码
        private String code = null;
        // 验证码图片Buffer
        private BufferedImage buffImg = null;
    
        // 验证码字符集 排除较难分辨的 I 1
        private 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', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
    
        public CodeUtil() {
            this.creatCodeImage();
        }
    
        /**
         * 
         * @param width
         *            图片宽
         * @param height
         *            图片高
         */
        public CodeUtil(int width, int height) {
            this.width = width;
            this.height = height;
            this.creatCodeImage();
        }
    
        /**
         * 
         * @param width
         *            图片宽
         * @param height
         *            图片高
         * @param codeCount
         *            字符个数
         * @param lineCount
         *            干扰线条数
         */
        public CodeUtil(int width, int height, int codeCount, int lineCount) {
            this.width = width;
            this.height = height;
            this.codeCount = codeCount;
            this.lineCount = lineCount;
            this.creatCodeImage();
        }
    
        public void creatCodeImage() {
            int x = 0, fontHeight = 0, codeY = 0;
            int red = 0, green = 0, blue = 0;
    
            x = width / (codeCount + 2);// 每个字符的宽度
            fontHeight = height - 2;// 字体的高度
            codeY = height - 4;
    
            // 图像buffer
            /*
             * TYPE_INT_RGB:表示一个图像它具有合成整数像素的8位RGB颜色分量。
             */
            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = buffImg.createGraphics();
            // 生成随机数
            Random random = new Random();
            // 将图像填充为白色
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, width, height);
            // 创建字体
            Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
            g.setFont(font);
            // 干扰线
            for (int i = 0; i < lineCount; i++) {
                int xs = random.nextInt(width);
                int ys = random.nextInt(height);
                int xe = xs + random.nextInt(width / 4);
                int ye = ys + random.nextInt(height / 4);
                red = random.nextInt(255);
                green = random.nextInt(255);
                blue = random.nextInt(255);
                g.setColor(new Color(red, green, blue));
                g.drawLine(xs, ys, xe, ye);
                g.drawOval(xs, ys, xe - xs, (ye - ys) * 2);// 画椭圆
                g.fillOval(xs, ys, xe - xs, (ye - ys) * 2);// 填充
            }
    
            // randomCode记录随机产生的验证码
            StringBuffer randomCode = new StringBuffer();
            // 随机产生codeCount个字符的验证码。
            for (int i = 0; i < codeCount; i++) {
                String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
                // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
                red = random.nextInt(255);
                green = random.nextInt(255);
                blue = random.nextInt(255);
                g.setColor(new Color(red, green, blue));
                g.drawString(strRand, (i + 1) * x, codeY);
                //设置字体旋转
                int zhuan = random.nextInt(20);
                int fzhuan = -random.nextInt(20);
                g.rotate(Math.toRadians(zhuan), 25 * (i - 1), 20); /// 坐标系顺时针转
                g.rotate(Math.toRadians(fzhuan), 25 * (i - 1), 20); /// 坐标系逆时针转
                // 将产生的四个随机数组合在一起。
                randomCode.append(strRand);
            }
            // 将四位数字的验证码保存到Session中。
            code = randomCode.toString();
    
        }
    
        public void write(String path) throws IOException {
            OutputStream sos = new FileOutputStream(path);
            this.write(sos);
        }
    
        public void write(OutputStream sos) throws IOException {
            ImageIO.write(buffImg, "png", sos);
            sos.close();
        }
    
        public BufferedImage getBuffImg() {
            return buffImg;
        }
    
        public String getCode() {
            return code;
        }

    controller类:

    @Controller
    public class CodeTestController {
        @RequestMapping("/getCode.do")
        public void getCode(HttpServletRequest reqeust, HttpServletResponse response) throws IOException {
    
            response.setContentType("image/jpeg");
            // 禁止图像缓存。
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
    
            HttpSession session = reqeust.getSession();
    
            CodeUtil vCode = new CodeUtil(100, 28, 4, 100);
            session.setAttribute("code", vCode.getCode());
            vCode.write(response.getOutputStream());
        }
        
    }

    html页面:

                     <div>
                                    <img src="../getCode.do" id="CreateCheckCode" align="middle" title="点击刷新验证码" onclick="getCode()" style="cursor: pointer;"></img>
                                    <input id="inputCode" type="text" value="请输入验证码"/>
                                </div>

     js:

    function getCode() {
            $("#CreateCheckCode").attr('src',
                    "../getCode.do?nocache=" + new Date().getTime());
        }

     效果:

  • 相关阅读:
    面向对象的本质是算法的上下文封装,是同一类属的行为接口的一致性
    结构化方法和面向对象方法的比较
    需求文档和软件都是服务的集合
    注意 Laravel 清除缓存 php artisan cache:clear 的一个坑
    面向对象复习笔记(一)
    详解如何在Laravel中增加自定义全局函数
    Laravel 引入自定义类库或第三方类库
    PHP怎么调用其他类的方法
    Laravel如何引用第三方(自定义)库
    laravel框架手机发送验证码
  • 原文地址:https://www.cnblogs.com/lensener/p/7656538.html
Copyright © 2020-2023  润新知