随机生成验证码-图案

1实现代码

//工具类
package com.cn.lze.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * @auther sunlongfei
 * create at 2022/6/8 16:20
 * @pragram smart-park-parent
 * @description: 随机码生成图片
 */
@Component
public class RandomValidateCodeUtil {

    private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
    //随机产生只有数字的字符串
    public static final String RANDOM_CODE_KEY = "RANDOMVALIDATECODEKEY";
    //随机产生数字,小写字母,大写字母的字符串
    private String randomStr ="01234567890abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM";

    private int width = 95;//图片宽

    private int height = 25;//图片高

    private int lineSize = 40;//干扰线数量

    private int strNum = 4;//随机产生字符数量

    private Random random = new Random();//随机数
    /**
     * 获得字体
     */
    private Font getFont(){
        return new Font("Fixedsys",Font.CENTER_BASELINE,18);
    }

    /**
     *获得颜色
     */
    private Color getColor(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);
    }
    /**
     * ⽣成随机图⽚
     */
    public String getRandCode(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        // BufferedImage类是具有缓冲区的Image类,Image类是⽤于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();// 产⽣Image对象的Graphics对象,改对象可以在图像上进⾏各种绘制操作
        g.fillRect(0, 0, width, height);//图⽚⼤⼩
        g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体⼤⼩
        g.setColor(getColor(110, 133));//字体颜⾊
        // 绘制⼲扰线
        for (int i = 0; i <= lineSize; i++) {
            drowLine(g);
        }
        // 绘制随机字符
        String randomString = "";
        for (int i = 1; i <= strNum; i++) {
            randomString = drowString(g, randomString, i);
        }
        response.addHeader("code",randomString);
        request.setAttribute("code",randomString);
        logger.info("生成的随机码:" +randomString);
        //将⽣成的随机字符串保存到session中
        session.removeAttribute(RANDOM_CODE_KEY);
        session.setAttribute(RANDOM_CODE_KEY, randomString);
        g.dispose();
        try {
            // 将内存中的图⽚通过流动形式输出到客户端
            ImageIO.write(image, "JPEG", response.getOutputStream());
        } catch (Exception e) {
            logger.error("将内存中的图⽚通过流动形式输出到客户端失败>>>> ", e);
            return "";
        }
        return randomString;
    }

    /**
     * 绘制字符串
     */
    private String drowString(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(randomStr
                .length())));
        randomString += rand;
        g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(rand, 13 * i, 16);
        return randomString;
    }
    /**
     * 绘制⼲扰线
     */
    private void drowLine(Graphics g) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.drawLine(x, y, x + xl, y + yl);
    }
    /**
     * 获取随机的字符
     */
    public String getRandomString(int num) {
        return String.valueOf(randomStr.charAt(num));
    }


}

 

  

2Conttroller层实现

 

@RequestMapping(value = "/getVerify",method = RequestMethod.GET)
    public void getVerify(HttpServletRequest request, HttpServletResponse response){
        try {
            //设置相应类型,告诉浏览器输出的内容为图片
            response.setContentType("image/jpeg");
            response.setHeader("Pragma","no-cache");
            response.setHeader("Cache-Control","no-cache");
            response.setDateHeader("Expire",0);
            String code = randomValidateCodeUtil.getRandCode(request,response);//输出
            if(StringUtils.isBlank(code)){
                return ;
            }
            redisTemplate.opsForValue().set(code,code,20*60,TimeUnit.SECONDS);//随机验证码-2分钟有效
            Map<String,String> map = new HashMap<>();
            map.put("code",code);
        }catch (Exception e) {
            logger.error("生成验证码失败",e);
        }

 

posted @ 2022-06-23 18:01  繁华纤尽依然保持初心  阅读(18)  评论(0)    收藏  举报