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){
MapreturnMap=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";
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。