本文将使用Jcaptcha实现校验码验证,并演示在Spring/SpringMVC环境下的使用方法。

1. maven依赖

  1. <dependency>
  2. <groupId>com.octo.captcha</groupId>
  3. <artifactId>jcaptcha-all</artifactId>
  4. <version>1.0-RC6</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>quartz</groupId>
  8. <artifactId>quartz</artifactId>
  9. </exclusion>
  10. <exclusion>
  11. <groupId>commons-dbcp</groupId>
  12. <artifactId>commons-dbcp</artifactId>
  13. </exclusion>
  14. <exclusion>
  15. <groupId>commons-pool</groupId>
  16. <artifactId>commons-pool</artifactId>
  17. </exclusion>
  18. <exclusion>
  19. <groupId>hsqldb</groupId>
  20. <artifactId>hsqldb</artifactId>
  21. </exclusion>
  22. <exclusion>
  23. <groupId>net.sf.ehcache</groupId>
  24. <artifactId>ehcache</artifactId>
  25. </exclusion>
  26. <exclusion>
  27. <groupId>concurrent</groupId>
  28. <artifactId>concurrent</artifactId>
  29. </exclusion>
  30. <exclusion>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring</artifactId>
  33. </exclusion>
  34. <exclusion>
  35. <groupId>xerces</groupId>
  36. <artifactId>xercesImpl</artifactId>
  37. </exclusion>
  38. <exclusion>
  39. <groupId>xerces</groupId>
  40. <artifactId>xmlParserAPIs</artifactId>
  41. </exclusion>
  42. </exclusions>
  43. </dependency>

注:请按需对需要排除的依赖进行增减

2. 需要将Jcaptcha的Bean加入Spring管理,故新增Spring-Jcaptcha的配置文件。web.xml中

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>
  4. classpath*:applicationContext.xml
  5. classpath*:applicationContext-captcha.xml
  6. </param-value>
  7. </context-param>

3. applicationContext-captcha.xml的内容

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
  5. default-lazy-init="true">
  6.  
  7. <bean id="captchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">
  8. <constructor-arg index="0" ref="imageEngine" />
  9. <constructor-arg type="int" index="1" value="180" />
  10. <constructor-arg type="int" index="2" value="100000" />
  11. </bean>
  12.  
  13. <bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine">
  14. <constructor-arg index="0">
  15. <list>
  16. <ref bean="captchaFactory" />
  17. </list>
  18. </constructor-arg>
  19. </bean>
  20.  
  21. <bean id="captchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory">
  22. <constructor-arg>
  23. <ref bean="wordgen" />
  24. </constructor-arg>
  25. <constructor-arg>
  26. <ref bean="wordtoimage" />
  27. </constructor-arg>
  28. </bean>
  29.  
  30. <bean id="wordgen" class="com.octo.captcha.component.word.wordgenerator.RandomWordGenerator">
  31. <!--可选字符-->
  32. <constructor-arg>
  33. <value>
  34. 0123456789abcdefghijklmnopqrstuvwxyz
  35. </value>
  36. </constructor-arg>
  37. </bean>
  38.  
  39. <bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage">
  40. <constructor-arg index="0">
  41. <ref bean="fontGenRandom" />
  42. </constructor-arg>
  43. <constructor-arg index="1">
  44. <ref bean="backGenUni" />
  45. </constructor-arg>
  46. <constructor-arg index="2">
  47. <ref bean="decoratedPaster" />
  48. </constructor-arg>
  49. </bean>
  50.  
  51. <bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator">
  52. <!--最小字体-->
  53. <constructor-arg index="0">
  54. <value>20</value>
  55. </constructor-arg>
  56. <!--最大字体-->
  57. <constructor-arg index="1">
  58. <value>20</value>
  59. </constructor-arg>
  60. <constructor-arg index="2">
  61. <list>
  62. <bean class="java.awt.Font">
  63. <constructor-arg index="0">
  64. <value>Arial</value>
  65. </constructor-arg>
  66. <constructor-arg index="1">
  67. <value>0</value>
  68. </constructor-arg>
  69. <constructor-arg index="2">
  70. <value>20</value>
  71. </constructor-arg>
  72. </bean>
  73. </list>
  74. </constructor-arg>
  75. </bean>
  76.  
  77. <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
  78. <!--背景宽度-->
  79. <constructor-arg index="0">
  80. <value>80</value>
  81. </constructor-arg>
  82. <!--背景高度-->
  83. <constructor-arg index="1">
  84. <value>32</value>
  85. </constructor-arg>
  86. </bean>
  87.  
  88. <bean id="decoratedPaster" class="com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster">
  89. <!--最大字符长度-->
  90. <constructor-arg type="java.lang.Integer" index="0">
  91. <value>4</value>
  92. </constructor-arg>
  93. <!--最小字符长度-->
  94. <constructor-arg type="java.lang.Integer" index="1">
  95. <value>4</value>
  96. </constructor-arg>
  97. <!--文本颜色-->
  98. <constructor-arg index="2">
  99. <ref bean="colorGen" />
  100. </constructor-arg>
  101. <!--文本混淆-->
  102. <constructor-arg index="3">
  103. <list>
  104. <!--<ref bean="baffleDecorator"/>-->
  105. </list>
  106. </constructor-arg>
  107. </bean>
  108.  
  109. <bean id="baffleDecorator" class="com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator">
  110. <constructor-arg type="java.lang.Integer" index="0">
  111. <value>1</value>
  112. </constructor-arg>
  113. <constructor-arg type="java.awt.Color" index="1">
  114. <ref bean="colorWrite" />
  115. </constructor-arg>
  116. </bean>
  117.  
  118. <bean id="colorGen" class="com.octo.captcha.component.image.color.SingleColorGenerator">
  119. <constructor-arg type="java.awt.Color" index="0">
  120. <ref bean="colorDimGrey" />
  121. </constructor-arg>
  122. </bean>
  123.  
  124. <bean id="colorWrite" class="java.awt.Color">
  125. <constructor-arg type="int" index="0">
  126. <value>255</value>
  127. </constructor-arg>
  128. <constructor-arg type="int" index="1">
  129. <value>255</value>
  130. </constructor-arg>
  131. <constructor-arg type="int" index="2">
  132. <value>255</value>
  133. </constructor-arg>
  134. </bean>
  135.  
  136. <bean id="colorDimGrey" class="java.awt.Color">
  137. <constructor-arg type="int" index="0">
  138. <value>105</value>
  139. </constructor-arg>
  140. <constructor-arg type="int" index="1">
  141. <value>105</value>
  142. </constructor-arg>
  143. <constructor-arg type="int" index="2">
  144. <value>105</value>
  145. </constructor-arg>
  146. </bean>
  147. </beans>

4. 服务端生成校验码

  1. package personal.hutao.captcha;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6.  
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.ServletOutputStream;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.web.bind.annotation.RequestMapping;
  17.  
  18. import com.octo.captcha.service.image.ImageCaptchaService;
  19.  
  20. @Controller
  21. @RequestMapping("/captcha")
  22. public class JcaptchaImageCreater {
  23.  
  24. private Logger logger = LoggerFactory.getLogger(getClass());
  25.  
  26. @Autowired
  27. private ImageCaptchaService imageCaptchaService;
  28.  
  29. @RequestMapping
  30. public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
  31. try {
  32. ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
  33. String captchaId = request.getSession().getId();
  34. BufferedImage challenge = imageCaptchaService.getImageChallengeForID(captchaId, request.getLocale());
  35.  
  36. response.setHeader("Cache-Control", "no-store");
  37. response.setHeader("Pragma", "no-cache");
  38. response.setDateHeader("Expires", 0L);
  39. response.setContentType("image/jpeg");
  40.  
  41. ImageIO.write(challenge, "jpeg", jpegOutputStream);
  42. byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
  43.  
  44. ServletOutputStream respOs = response.getOutputStream();
  45. respOs.write(captchaChallengeAsJpeg);
  46. respOs.flush();
  47. respOs.close();
  48. } catch (IOException e) {
  49. logger.error("generate captcha image error: {}", e.getMessage());
  50. }
  51. }
  52.  
  53. }

5. 页面调用

  1. <input type="text" id="captcha" name="captcha" maxlength="4" />
  2. <img src="captcha" onclick="this.src='captcha?d='+new Date().getTime()"/>

如图:

6. 提交登录表单后,校验

  1. package personal.hutao.controller;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10.  
  11. import com.octo.captcha.service.image.ImageCaptchaService;
  12.  
  13. @RequestMapping("/login")
  14. @Controller
  15. public class LoginController {
  16.  
  17. @Autowired
  18. private ImageCaptchaService imageCaptchaService;
  19.  
  20. @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
  21. @ResponseBody
  22. public Boolean login(String username, String password, String captcha, HttpServletRequest request) {
  23. Boolean result = Boolean.FALSE;
  24.  
  25. Boolean isResponseCorrect = imageCaptchaService.validateResponseForID(request.getSession().getId(), captcha);
  26. if (isResponseCorrect) {
  27. // 继续校验用户名密码等..
  28. }
  29.  
  30. return result;
  31. }
  32.  
  33. }

Spring中使用Jcaptcha实现校验码验证的更多相关文章

  1. SpringMVC中使用Jcaptcha实现校验码验证

    SpringMVC中使用Jcaptcha实现校验码验证:http://www.tuicool.com/articles/rMzAFj 本文将使用Jcaptcha实现校验码验证,并演示在Spring/S ...

  2. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  3. 6.2 dubbo在spring中自定义xml标签源码解析

    在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...

  4. Spring官网阅读(十七)Spring中的数据校验

    文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...

  5. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...

  6. 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析

    关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...

  7. 【小家Spring】聊聊Spring中的数据绑定 --- DataBinder本尊(源码分析)

    每篇一句 唯有热爱和坚持,才能让你在程序人生中屹立不倒,切忌跟风什么语言或就学什么去~ 相关阅读 [小家Spring]聊聊Spring中的数据绑定 --- 属性访问器PropertyAccessor和 ...

  8. Spring中@Transactional事务回滚实例及源码

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  9. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

随机推荐

  1. mac 连接mysql提示 Warning: mysqli::real_connect(): (HY000/2002): No such file or directory

    mac 连接mysql的时候提示 Warning: mysqli::real_connect(): (HY000/2002): No such file or directory [说明1]MAC下M ...

  2. 神奇的Noip模拟试题 T3 科技节 位运算

    3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...

  3. RM报表的选项 注册表位置

    HKCU\Software\WHF SoftWare\Report Machine\RMReport\Form\RMDesignerForm\ 设计器-工具-选项的设置 HKCU\Software\W ...

  4. 在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件

    Stimulsoft Reports Designer.Web报表控件是一款网页报表设计器.您想在网页中编辑您的报表吗?现在是可能的! Stimulsoft Reports Designer.Web ...

  5. [Windows驱动]驱动包(Driver Packages)

    在windows下安装一个驱动,我们你需要把所有需要的软件打包-称为驱动包.驱动包里包括系统提供的给所有设备类使用的一般安装工具,还包括了设备商提供的设备特定的组件.下面我们就来看看驱动包里具体需要哪 ...

  6. 迭代器(Iterator)模式

    转自:http://blog.csdn.net/lilu_leo/article/details/7609496 概述      迭代器(Iterator)模式,又叫做游标(Cursor)模式.GOF ...

  7. Apparmor——Linux内核中的强制访问控制系统

      AppArmor 因为最近在研究OJ(oline judge)后台的安全模块的实现,所以一直在研究Linux下沙箱的东西,同时发现了Apparmor可以提供访问控制. AppArmor(Appli ...

  8. 2016 - 1 - 20 runloop学习

    一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...

  9. C++11 move_iterator

    template<typename Iterator> class move_iterator { Iterator current; public: typedef Iterator i ...

  10. php大力力 [012节]PHP连接mySQL数据库

    php大力力 [012节]PHP连接mySQL数据库 1.用简单的php测试代码,而不是直接进入前端页面,越简单越好 2.在=号前后,不要写空格,万一写了中文空格,排除错误很麻烦. 3.我在mysql ...