Spring Boot 验证码的生成和验证详解
前言
本文介绍的imagecode方法是一个生成图形验证码的请求,checkcode方法实现了对这个图形验证码的验证。从验证码的生成到验证的过程中,验证码是通过Session来保存的,并且设定一个验证码的最长有效时间为5分钟。验证码的生成规则是从0~9的数字中,随机产生一个4位数,并增加一些干扰元素,最终组合成为一个图形输出
1、验证码生成类
importjava.awt.*; importjava.awt.image.BufferedImage; importjava.io.OutputStream;importjava.util.HashMap; importjava.util.Map;importjava.util.Random; publicclassImageCode{ privatestaticcharmapTable[]={ '0','1','2','3','4','5', '6','7','8','9','0','1', '2','3','4','5','6','7', '8','9'}; publicstaticMapgetImageCode(intwidth,intheight,OutputStreamos){ Map returnMap=newHashMap (); if(width<=0)width=60; if(height<=0)height=20; BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //获取图形上下文 Graphicsg=image.getGraphics(); //生成随机类 Randomrandom=newRandom(); //设定背景色 g.setColor(getRandColor(200,250)); g.fillRect(0,0,width,height); //设定字体 g.setFont(newFont("TimesNewRoman",Font.PLAIN,18)); //随机产生168条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160,200)); for(inti=0;i<168;i++){ intx=random.nextInt(width); inty=random.nextInt(height); intxl=random.nextInt(12); intyl=random.nextInt(12); g.drawLine(x,y,x+xl,y+yl); } //取随机产生的码 StringstrEnsure=""; //4代表4位验证码,如果要生成更多位的认证码,则加大数值 for(inti=0;i<4;++i){ strEnsure+=mapTable[(int)(mapTable.length*Math.random())]; //将认证码显示到图象中 g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); //直接生成 Stringstr=strEnsure.substring(i,i+1); g.drawString(str,13*i+6,16); } //释放图形上下文 g.dispose(); returnMap.put("image",image); returnMap.put("strEnsure",strEnsure); returnreturnMap; } //给定范围获得随机颜色 staticColorgetRandColor(intfc,intbc){ Randomrandom=newRandom(); if(fc>255)fc=255; if(bc>255)bc=255; intr=fc+random.nextInt(bc-fc); intg=fc+random.nextInt(bc-fc); intb=fc+random.nextInt(bc-fc); returnnewColor(r,g,b); } }
2、获取验证码API
@RequestMapping(value="/images/imagecode") publicStringimagecode(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{ OutputStreamos=response.getOutputStream(); Mapmap=ImageCode.getImageCode(60,20,os); StringsimpleCaptcha="simpleCaptcha"; request.getSession().setAttribute(simpleCaptcha,map.get("strEnsure").toString().toLowerCase()); request.getSession().setAttribute("codeTime",newDate().getTime()); try{ ImageIO.write((BufferedImage)map.get("image"),"JPEG",os); }catch(IOExceptione){ return""; } returnnull; }
3、验证验证码API
@RequestMapping(value="/checkcode") @ResponseBody publicStringcheckcode(HttpServletRequestrequest,HttpSessionsession)throwsException{ StringcheckCode=request.getParameter("checkCode"); Objectcko=session.getAttribute("simpleCaptcha");//验证码对象 if(cko==null){ request.setAttribute("errorMsg","验证码已失效,请重新输入!"); return"验证码已失效,请重新输入!"; } Stringcaptcha=cko.toString(); Datenow=newDate(); LongcodeTime=Long.valueOf(session.getAttribute("codeTime")+""); if(StringUtils.isEmpty(checkCode)||captcha==null||!(checkCode.equalsIgnoreCase(captcha))){ request.setAttribute("errorMsg","验证码错误!"); return"验证码错误!"; }elseif((now.getTime()-codeTime)/1000/60>5){ //验证码有效时长为5分钟 request.setAttribute("errorMsg","验证码已失效,请重新输入!"); return"验证码已失效,请重新输入!"; }else{ session.removeAttribute("simpleCaptcha"); return"1"; } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。