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

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

 

1. maven依赖

Xml代码   收藏代码
  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中

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的内容

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. 服务端生成校验码

Java代码   收藏代码
  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. 页面调用

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

如图:

 

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

Java代码   收藏代码
  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. }  

 

 OK,至此就在Spring/SpringMVC环境下实现了Jcaptcha,赶快试试吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值