|
|
|
|
移动端

服务器开发系列--图形验证码到底是怎么回事?

验证码是一种区分用户是计算机还是人的公共全自动程序。短时间是无法退出人类舞台的,目前只是尽量提升用户体验。

作者:javatiku来源:Java面试那些事儿|2018-03-13 10:32

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


1.什么是验证码?

验证码是一种区分用户是计算机还是人的公共全自动程序。短时间是无法退出人类舞台的,目前只是尽量提升用户体验。

作用

  • 账号安全
  • 反作弊
  • 反爬虫
  • 防论坛灌水
  • 防恶意注册

分类

  • 图形验证码
  • Gif动画验证码
  • 手机短信验证码
  • 手机语音验证码
  • 视频验证码
  • web2.0验证码

2.kaptcha验证码组件

kaptcha 是一个非常实用的验证码生成工具;有了它,你可以生成各种样式的验证码,因为它是可配置的。

常见配置

  • 验证码的字体
  • 验证码字体的大小
  • 验证码字体的字体颜色
  • 验证码内容的范围(数字,字母,中文汉字)
  • 验证码图片的大小,边框,边框粗细,边框颜色
  • 验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)
  • 验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式)

引入maven配置

  1. <dependency> 
  2.     <groupId>com.github.axet</groupId> 
  3.     <artifactId>kaptcha</artifactId> 
  4.     <version>0.0.9</version> 
  5. </dependency> 

kaptcha.properties

  1. kaptcha.textproducer.font.color=red  
  2. kaptcha.image.width=130  
  3. kaptcha.image.height=44  
  4. kaptcha.textproducer.font.size=35  
  5. kaptcha.textproducer.char.length=4  
  6. kaptcha.textproducer.font.names=\\u5B8B\\u4F53,\\u6977\\u4F53,\\u5FAE\\u8F6F\\u96C5\\u9ED1  
  7. kaptcha.noise.color=gray 
  8. kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.WaterRipple 

用filter过滤器来生成验证码,具体步骤如下:

1、web.xml

  1. <filter> 
  2.     <filter-name>KaptchaFilter</filter-name
  3.     <filter-class>com.xxoo.admin.ui.filter.KaptchaFilter</filter-class> 
  4. </filter> 
  5. <filter-mapping> 
  6.     <filter-name>KaptchaFilter</filter-name
  7.     <url-pattern>/kaptcha.jpg</url-pattern> 
  8. </filter-mapping> 

说明:验证码过滤器需要放到Shiro之后,因为Shiro将包装HttpSession.如果不,可能造成两次的sesisonid不一样。

2、图片验证码类

  1. public class CaptchaService { 
  2.     private static ImageCaptchaService instance = null 
  3.     static { 
  4.         instance = new KaptchaImageCaptchaService(); 
  5.     }  
  6.     public synchronized static ImageCaptchaService getInstance() { 
  7.         return instance; 
  8.     } 
  9.     public synchronized static boolean validate(HttpServletRequest httpServletRequest, String input) throws Exception { 
  10.         String text = instance.getText(httpServletRequest); 
  11.         boolean result = text.equalsIgnoreCase(input); 
  12.         instance.removeKaptcha(httpServletRequest); 
  13.         return result; 
  14.     } 

3、基于Kaptcha的验证码图片实现

  1. public class KaptchaImageCaptchaService implements ImageCaptchaService { 
  2.  
  3.     private Logger logger = LoggerFactory.getLogger(getClass()); 
  4.  
  5.     public KaptchaImageCaptchaService() { 
  6.     } 
  7.  
  8.     public static Config getConfig() throws IOException { 
  9.         Properties p = new Properties(); 
  10.         p.load(new DefaultResourceLoader().getResource("kaptcha.properties").getInputStream()); 
  11.         Config config = new Config(p); 
  12.         return config; 
  13.     } 
  14.  
  15.     @Override 
  16.     public void create(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { 
  17.         httpServletResponse.setDateHeader("Expires", 0L); 
  18.         httpServletResponse.setHeader("Cache-Control""no-store, no-cache, must-revalidate"); 
  19.         httpServletResponse.addHeader("Cache-Control""post-check=0, pre-check=0"); 
  20.         httpServletResponse.setHeader("Pragma""no-cache"); 
  21.         httpServletResponse.setContentType("image/jpeg"); 
  22.         Config config = getConfig(); 
  23.         Producer producer = config.getProducerImpl(); 
  24.         String capText = producer.createText(); 
  25.         if(logger.isDebugEnabled()){ 
  26.             logger.info("create captcha:" + capText + ":" + config.getSessionKey() ); 
  27.         } 
  28.         httpServletRequest.getSession().setAttribute(config.getSessionKey(), capText); 
  29.         httpServletRequest.getSession().setAttribute(config.getSessionDate(), new Date()); 
  30.         BufferedImage bi = producer.createImage(capText); 
  31.         ServletOutputStream out = httpServletResponse.getOutputStream(); 
  32.         ImageIO.write(bi, "jpg"out); 
  33.         out.flush(); 
  34.         out.close(); 
  35.     } 
  36.  
  37.     @Override 
  38.     public String getText(HttpServletRequest httpServletRequest) throws Exception { 
  39.         return (String)httpServletRequest.getSession().getAttribute(getConfig().getSessionKey()); 
  40.     } 
  41.  
  42.     @Override 
  43.     public void removeKaptcha(HttpServletRequest httpServletRequest) throws Exception { 
  44.         httpServletRequest.getSession().removeAttribute(getConfig().getSessionKey()); 
  45.         httpServletRequest.getSession().removeAttribute(getConfig().getSessionDate()); 
  46.     } 
  47.  

4、验证码工具类

  1. public class CaptchaService { 
  2.  
  3.     private static ImageCaptchaService instance = null
  4.  
  5.     static { 
  6.         instance = new KaptchaImageCaptchaService(); 
  7.     } 
  8.  
  9.     public synchronized static ImageCaptchaService getInstance() { 
  10.         return instance; 
  11.     } 
  12.  
  13.     public synchronized static boolean validate(HttpServletRequest httpServletRequest, String input) throws Exception { 
  14.         String text = instance.getText(httpServletRequest); 
  15.         boolean result = text.equalsIgnoreCase(input); 
  16.         instance.removeKaptcha(httpServletRequest); 
  17.         return result; 
  18.     } 

5、生成验证码过滤器

  1. public class KaptchaFilter extends OncePerRequestFilter { 
  2.  
  3.     private Logger logger = LoggerFactory.getLogger(getClass()); 
  4.  
  5.     @Override 
  6.     protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { 
  7.         try { 
  8.             CaptchaService.getInstance().create(httpServletRequest,httpServletResponse); 
  9.         } catch (Exception e) { 
  10.             logger.info("create captcha error.",e); 
  11.         } 
  12.     } 
  13.  

6、验证码校验

  1. private boolean doCaptchaValidate(HttpServletRequest request, String code) { 
  2.         //比对 
  3.         try { 
  4.             if (code == null || !CaptchaService.validate(request, code)) { 
  5.                 return false
  6.             } else { 
  7.                 return true
  8.             } 
  9.         } catch (Exception e) { 
  10.             logger.warn("captcha check error!"); 
  11.             return false
  12.         } 

总结

本文主要讲述了kaptcha图形化验证码的使用和介绍,小伙伴可以根据自己的需求进行引入。

【编辑推荐】

  1. 全球云服务器市场格局变动,透露出怎样的信息与风向?
  2. 无服务器计算将改变关系数据库的游戏规则
  3. 【服务器】PHP如何实现依赖注入?
  4. AMD Scott Aylor:借助霄龙3000和锐龙V1000系列嵌入处理器,为边缘计算持续加速
  5. 如何打破服务器芯片垄断
【责任编辑:武晓燕 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

视频课程+更多

热门职位+更多

读 书 +更多

网络工程师必读——网络工程基础

本书是一本知识全面、系统、专业的网络工程基础知识必备图书。全书条理清晰、逻辑性强,遵循从全局到细节,从底层基础到高层应用的顺序全面...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊