验证码的简单原理

    xiaoxiao2021-11-30  47

     最近项目用到登录验证码,简单总结一下我们的处理方式。

    随机的图片是放在文件服务器 ,这里用的是fastdsf   存库

    批量生产验证码

       ValidateCode code = new ValidateCode();         for (int i = 0; i < 200; i++) {           random = userValidateImageService.getRandomImageAndUrl();           arg = random.split(";");           code.setValidateCode(arg[0]);           code.setValidateImage(arg[1]);           validateCodeMapper.insertSelective(code);         }

    ---------------------------------------------------

    package com.zfs.service.user.impl; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.util.Random; import javax.annotation.Resource; import javax.imageio.ImageIO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.zfs.service.fastdfs.FileClientService; import com.zfs.service.user.IUserValidateImageService; import com.zfs.tool.ConfigTool; import com.zfs.tool.RandomValidateCode; @Service public class UserValidateImageSerivceImpl implements IUserValidateImageService  {      @Resource      private FileClientService fileClientService;                private static final Logger logger = (Logger) LoggerFactory                 .getLogger(UserValidateImageSerivceImpl.class);           public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key      private Random random = new Random();      private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串           private int width = 80;//图片宽      private int height = 26;//图片高      private int lineSize = 40;//干扰线数量      private int stringNum = 4;//随机产生字符数量      /*       * 获得字体       */      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);      }            /**       * 生成随机图片       */     @Override     public String getRandomImageAndUrl() {         //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 = "";         String randImg = "";         for(int i=1;i<=stringNum;i++){             randomString=drowString(g,randomString,i);         }         logger.info("----------------------------------------->验证码"+randomString);         String fileName = randomString + ".jpg";         String path = ConfigTool.getConfigValue("tempPath") + "/" + fileName;         File file = new File(path);                          g.dispose();         try {             ImageIO.write(image, "JPEG", file);             randImg = fileClientService.uploadFile(file);            // FileClientServiceImpl           // ImageIO.write(image, "JPEG", file);//将内存中的图片通过流动形式输出到客户端            // HttpServletResponse            //     ImageIO.write(image, "JPEG", response.getOutputStream());         } catch (Exception e) {             e.printStackTrace();         }         randomString =randomString+";"+randImg;        return randomString;     }           //FileClientServiceImpl fileClientServiceImpl = new FileClientServiceImpl();                 /*       * 绘制字符串       */      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));      }           public static void main(String[] args) {         RandomValidateCode randomValidateCode = new RandomValidateCode();         for (int i = 0; i < 200; i++) {          String randomString = randomValidateCode.getRandcode();         }     }           }     

    -------------------------------------------------------------

    页面显示取得二维码

    首页登录是 随机random 200之内的数。

    user.getRandomSeries = function(range) {     var str = Math.floor((Math.random()) * (range));     if(str==0){         str =Math.floor((Math.random()) * (range));     }     return  str; }

    .加入cookies

      base.addCookie("C_I_C",timestamp,{path:"/",expires: 7});             $.ajax({                   type:"post",                 data:par,                 dataType:'text',                 url:cms.url.admin.randomValidate,                 success: function(data){                                          $(obj).prev().attr("src",data);                 }             });

    后台取。

     @Override   public String getValidateCode(HttpServletResponse response, Integer randCode) {     ValidateCode validateCode = new ValidateCode();     String result = "";     String validateImgPath = "";     validateCode = this.validateCodeMapper.selectByPrimaryKey(randCode);     validateImgPath = ConfigTool.getConfigValue("FilePath");     result = validateImgPath + validateCode.getValidateImage();     return result;   }

    /后端验证输入的验证码 与 页面的验证码 匹配 规则

    "mycode":base.getCookie("C_I_C")

     ValidateCode validateCode = this.validateCodeMapper.selectByPrimaryKey(myCode);

    if (userCode.equalsIgnoreCase(validateCode.getValidateCode())) //忽略大小写匹配

    页面的

    转载请注明原文地址: https://ju.6miu.com/read-679071.html

    最新回复(0)