怎么用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实现图片验证码功能”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php操作redis大全记录
php连接redis测试˂?php$redis=newRedis();$redis-˃conne...
-
PHP经典高级工程师面试题
1.PHP如何实现不用自带的cookie函数为客户端下发cookie。对于分布式系统,如何来保存session值...
-
PHP操作Redis数据库
-
php利用redis防止商品超发来限制抢购,简单又实用
-
php如何实现秒杀功能?php+redis模拟简单抢购场景,快来看看吧
-
PHP高级工程师面试题
-
Laravel结合Redis发送邮箱验证码
-
使用redis缓存实现多服务器PHP sessions共享