怎么用Springboot +redis+Kaptcha实现图片验证码功能

怎么用Springboot +redis+Kaptcha实现图片验证码功能

这篇文章主要介绍了怎么用Springboot+redis+Kaptcha实现图片验证码功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Springboot+redis+Kaptcha实现图片验证码功能文章都会有所收获,下面我们一起来看看吧。

背景

  • 注册-登录-修改密码一般需要发送验证码,但是容易被攻击恶意调⽤

  • 什么是短信-邮箱轰炸机

  • 手机短信轰炸机是批、循环给手机无限发送各种网站的注册验证码短信的方法。

  • 公司带来的损失

  • 短信1条5分钱,如果被大盗刷大家自己计算 邮箱通知不用钱,但被大盗刷,带宽、连接等都被占用,导致无法正常使用

  • 如何避免自己的网站成为”肉鸡“或者被刷呢

  • 增加图形验证码(开发人员)

  • 单IP请求次数限制(开发人员)

  • 限制号码发送(一般短信提供商会做)

  • 攻防永远是有的,只过加大了攻击者的成本,ROI划不过来⾃然就放弃了

Kaptcha 框架介绍

谷歌开源的一个可高度配置的实用验证码生成工具

  • 验证码的字体/大小/颜色

  • 验证码内容的范围(数字,字母,中文汉字!)

  • 验证码图⽚的大小,边框,边框粗细,边框颜色

  • 验证码的⼲扰线 验证码的样式(鱼眼样式、3D、普通 模糊)

添加依赖

<!--kaptcha依赖包--><dependency><groupId>com.baomidou</groupId><artifactId>kaptcha-spring-bootstarter</artifactId><version>1.0.0</version></dependency>

配置类

/***图像验证码的配置文件*@author:look-word*@date:2022-01-2817:10**/@ConfigurationpublicclassCaptchaConfig{/***验证码配置*Kaptcha配置类名**@return*/@Bean@Qualifier("captchaProducer")publicDefaultKaptchakaptcha(){DefaultKaptchakaptcha=newDefaultKaptcha();Propertiesproperties=newProperties();//验证码个数properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4");//字体间隔properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE,"8");//⼲扰线颜⾊//⼲扰实现类properties.setProperty(Constants.KAPTCHA_NOISE_IMPL,"com.google.code.kaptcha.impl.NoNoise");//图⽚样式properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL,"com.google.code.kaptcha.impl.WaterRipple");//⽂字来源properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING,"0123456789");Configconfig=newConfig(properties);kaptcha.setConfig(config);returnkaptcha;}}

实战

我的配置类

获取访问ip和生成MD5的工具类

publicclassCommonUtil{/***获取ip*@paramrequest*@return*/publicstaticStringgetIpAddr(HttpServletRequestrequest){StringipAddress=null;try{ipAddress=request.getHeader("xforwarded-for");if(ipAddress==null||ipAddress.length()==0||"unknown".equalsIgnoreCase(ipAddress)){ipAddress=request.getHeader("Proxy-Client-IP");}request.getHeader("WL-Proxy-Client-IP");request.getRemoteAddr();if(ipAddress.equals("127.0.0.1")){//根据⽹卡取本机配置的IPInetAddressinet=null;try{inet=InetAddress.getLocalHost();}catch(UnknownHostExceptione){e.printStackTrace();}ipAddress=inet.getHostAddress();}//对于通过多个代理的情况,第⼀个IP为客户端真实IP,多个IP按照','分割if(ipAddress!=null&&ipAddress.length()>15){//"***.***.***.***".length()//=15if(ipAddress.indexOf(",")>0){ipAddress.substring(0,ipAddress.indexOf(","));}catch(Exceptione){ipAddress="";}returnipAddress;}publicstaticStringMD5(Stringdata){java.security.MessageDigestmd=MessageDigest.getInstance("MD5");byte[]array=md.digest(data.getBytes("UTF-8"));StringBuildersb=newStringBuilder();for(byteitem:array){sb.append(Integer.toHexString((item&0xFF)|0x100).substring(1,3));returnsb.toString().toUpperCase();}catch(Exceptionexception){returnnull;}

接口开发

@RestController@RequestMapping("/api/v1/captcha")publicclassCaptchaController{@AutowiredprivateStringRedisTemplatestringRedisTemplate;privateProducerproducer;@RequestMapping("get_captcha")publicvoidgetCaptcha(HttpServletRequestrequest,HttpServletResponseresponse){StringcaptchaText=producer.createText();Stringkey=getCaptchaKey(request);//十分钟过期stringRedisTemplate.opsForValue().set(key,captchaText,10,TimeUnit.MINUTES);BufferedImageimage=producer.createImage(captchaText);ServletOutputStreamoutputStream=null;try{outputStream=response.getOutputStream();ImageIO.write(image,"jpg",outputStream);outputStream.flush();outputStream.close();}catch(IOExceptione){e.printStackTrace();}}/***生成redis验证码模块的key*@paramrequest*@return*/privateStringgetCaptchaKey(HttpServletRequestrequest){StringipAddr=CommonUtil.getIpAddr(request);//请求头StringuserAgent=request.getHeader("user-Agent");Stringkey="user_service:captcha:"+CommonUtil.MD5(ipAddr+userAgent);returnkey;}

配置文件

server:port:8080spring:redis:host:redis锁在的ippassword:redis的密码port:端口号lettuce:pool:#连接池最⼤连接数(使⽤负值表示没有限制)max-idle:10#连接池中的最⼤空闲连接max-active:10#连接池中的最⼩空闲连接min-idle:0#连接池最⼤阻塞等待时间(使⽤负值表示没有限制)max-wait:-1ms

结果

关于“怎么用Springboot+redis+Kaptcha实现图片验证码功能”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用Springboot+redis+Kaptcha实现图片验证码功能”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-02-07 23:14:28
收藏
分享
海报
0 条评论
50
上一篇:Android中的Protobuf怎么使用 下一篇:java怎么实现图片转化为数据流
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码