zoukankan      html  css  js  c++  java
  • XX需求分析系统每日进度(一)

    添加验证码的更新和验证功能

    思路:后台随机生成四位数字或字母组合的字符串,并保存在Session域中,为保证安全以图片的形式返回给前台,通过比对前台传递的验证码内容和Session域是否一致进行校验

    • 主要代码如下
    1. 生成验证码工具类
    public class RandomValidateCodeUtil {
        public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key
    //    private String randString = "0123456789";//随机产生只有数字的字符串 private String
        //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
        private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
        private int width = 95;// 图片宽
        private int height = 25;// 图片高
        private int lineSize = 40;// 干扰线数量
        private int stringNum = 4;// 随机产生字符数量
    
        private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
    
        private Random random = new Random();
    
        /**
         * 获得字体
         */
        private Font getFont() {
            return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
        }
    
        /**
         * 获得颜色
         */
        private Color getRandColor(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 void 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(getRandColor(110, 133));//字体颜色
            // 绘制干扰线
            for (int i = 0; i <= lineSize; i++) {
                drowLine(g);
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= stringNum; i++) {
                randomString = drowString(g, randomString, i);
            }
            logger.info(randomString);
            //将生成的随机字符串保存到session中
            session.removeAttribute(RANDOMCODEKEY);
            session.setAttribute(RANDOMCODEKEY, randomString);
            g.dispose();
            try {
                // 将内存中的图片通过流动形式输出到客户端
                ImageIO.write(image, "JPEG", response.getOutputStream());
            } catch (Exception e) {
                logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);
            }
    
        }
    
        /**
         * 绘制字符串
         */
        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(randString
                    .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(randString.charAt(num));
        }
    }
    

    1. 后台返回验证码给前台
    /**
         * 生成验证码
         */
        @RequestMapping(value = "/getVerify")
        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);
                RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
                randomValidateCode.getRandcode(request, response);//输出验证码图片方法
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    1. 后台校验验证码
     /**
         * 校验验证码
         */
        @RequestMapping("/checkVerify")
        @ResponseBody
        public boolean checkVerify(@RequestBody Map<String, Object> requestMap, HttpServletRequest request) {
            try{
                HttpSession session = request.getSession();
                //从session中获取随机数
                System.out.println("requestMap = " + requestMap.toString());
                String inputStr = requestMap.get("inputStr").toString();
                System.out.println(inputStr);
    
                String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");
                if (random == null) {
                    return false;
                }
                if (random.equals(inputStr)) {
                    return true;
                } else {
                    return false;
                }
            }catch (Exception e){
                e.printStackTrace();
                return false;
            }
        }
    

    明天任务:学习树形结构,并尝试将学科分类替换为树形结构
  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/weixiao1717/p/13855442.html
Copyright © 2011-2022 走看看