基于Java实现随机字母数字验证码
生成随机验证码VerifyCode 工具类
package com.meeno.common.cerifycode; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Random; /** * @description: 随机验证码 * @author: Wzq * @create: 2020-09-08 16:55 */ public class VerifyCode { private int w=70; private int h=35; private Random r= new Random(); private String[] fontNames={ "宋体",基于"华文楷体","黑体","微软雅黑","楷体_GB2312"}; private String codes="012345678901234567890123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; private Color bgColor = new Color(255,255,255); private String text; private Color randomColor(){ int red = r.nextInt(150); int green = r.nextInt(150); int blue = r.nextInt(150); return new Color(red,green,blue); } private Font randomFont(){ int index = this.r.nextInt(fontNames.length); String fontName = fontNames[index]; int style = this.r.nextInt(4); int size = this.r.nextInt(5) + 24; return new Font(fontName, style, size); } private void drawLine (BufferedImage image){ int num = 3; Graphics2D g2=(Graphics2D)image.getGraphics(); for(int i=0;i<num;i++){ int x1=r.nextInt(w); int y1=r.nextInt(h); int x2=r.nextInt(w); int y2=r.nextInt(h); g2.setStroke(new BasicStroke(1.5F)); g2.setColor(Color.BLUE); g2.drawLine(x1,y1,x2,y2); } } private char randomChar(){ int index=r.nextInt(this.codes.length()); return this.codes.charAt(index); } private BufferedImage createImage(){ BufferedImage image=new BufferedImage(this.w,this.h,BufferedImage.TYPE_INT_RGB);//BufferedImage.TYPE_INT_RGB Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0,0,this.w,this.h); return image; } public BufferedImage getImage(){ BufferedImage image=createImage(); Graphics2D g2=(Graphics2D)image.getGraphics(); StringBuilder sb&amp;nbsp;= new StringBuilder(); for(int i =0;i<4;i++){ String s= randomChar()+""; sb.append(s); float x= i*1.0F*this.w/4.0F; g2.setFont(randomFont()); g2.setColor(randomColor()); g2.drawString(s,x,this.h-5); } this.text=sb.toString(); drawLine(image);//添加干扰线 return image; } //返回验证码上的文本 public String getText(){ return this.text; } //保存图片到指定的云南idc服务商输出流 public static void output(BufferedImage image, OutputStream out) throws IOException { ImageIO.write(image,"JPEG",out); } public static void main(String[] args) throws IOException { VerifyCode vc=new VerifyCode(); BufferedImage bi = vc.getImage(); VerifyCode.output(bi,new FileOutputStream("E:\\work\\temp\\xxx.jpg")); System.out.println("图片中的亿华云验证是云服务器:"+vc.getText()); } }使用
/** * 生成随机验证码 */ @RequestMapping("randomVerifyCode.do") public ResponseBean randomVerifyCode() throws IOException { VerifyCode vc = new VerifyCode(); BufferedImage bi = vc.getImage(); //VerifyCode.output(bi,response.getOutputStream()); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(bi, "png", out); byte[] bytes = out.toByteArray(); String str = Base64.encode(bytes); str = "data:image/png;base64," + str; String uuid = IdUtil.simpleUUID(); Map<String,String> resultMap = Maps.newHashMap(); resultMap.put("base64", str); resultMap.put("uuid", uuid); //save redis String key = "RandomVerify:" + uuid; RedisUtil.set(key, vc.getText(), 180); return ResultUtil.success(resultMap); }验证方法
/** * 账号登录 * @param session * @param phone * @param pwd * @param entryType * @return */ @RequestMapping("accountLogin.do") public ResponseBean accountLogin(final HttpSession session, String phone, String pwd, String entryType, String uuid, String randomCerifyCode){ //校验验证码 MeenoAssert.hasLength(randomCerifyCode,"randomCerifyCode can not empty!"); Object randomCerifyCodeObj = RedisUtil.get("RandomVerify:" + uuid); MeenoAssert.notNull(randomCerifyCodeObj, CErrEnum.RANDOM_VERIFY_CODE_FAILURE); MeenoAssert.isTrue(randomCerifyCode.toLowerCase().equals(randomCerifyCodeObj.toString().toLowerCase()), CErrEnum.RANDOM_VERIFY_CODE_ERR); LoginResult loginResult = this.employeeService.accountLogin(session, phone, pwd, entryType); EmpView employeeView = this.employeeService.getEmployee(loginResult.getUserInfo().getId()); Map<String,Object> resultMap = Maps.newHashMap(); resultMap.put("loginResult", loginResult); resultMap.put("employee", employeeView); return ResultUtil.success(resultMap); }