最近项目用到登录验证码,简单总结一下我们的处理方式。
随机的图片是放在文件服务器 ,这里用的是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())) //忽略大小写匹配
页面的