kaptcha验证码使用

查看原文:http://www.ibloger.net/article/135.html

效果图:


官方地址:https://code.google.com/p/kaptcha/w/list

kaptcha 是一个非常实用的验证码生成工具。有了它,你可以生成各种样式的验证码,因为它是可配置的。kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一个图片。同时将生成的验证码字符串放到 HttpSession中。

使用kaptcha可以方便的配置:

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

……

下面介绍一下用法:

实现方式有多种,下面介绍Spring注入方式和Servlet方式

Servlet方式

1.建立一个web项目,导入kaptcha-2.3.2.jar到环境变量中。

2.配置web.xml增加servlet

[html]  view plain  copy
 print ?
  1. <servlet>    
  2.         <servlet-name>Kaptcha</servlet-name>    
  3.         <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>    
  4. </servlet>    
  5. <servlet-mapping>    
  6.         <servlet-name>Kaptcha</servlet-name>    
  7.         <url-pattern>/kaptcha.jpg</url-pattern>    
  8. </servlet-mapping>    
3、在jsp页面中
[html]  view plain  copy
 print ?
  1. <form action="submit.action" method="post">    
  2.     <img src="kaptcha.jpg" id="kaptchaImage" /> <input type="text"    
  3.         name="kaptcha" value="" /> <input type="submit" name="submit"    
  4.         value="submit" />    
  5. </form>    
其中src="kaptcha.jpg"会被定位到servlet上

4、KaptchaServlet会把验证码设置到session中,可以如下方式获取

[html]  view plain  copy
 print ?
  1. String kaptchaExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);  
5、如果是struts2的action,可以如下方式获取
[html]  view plain  copy
 print ?
  1. String kaptchaExpected = (String)ActionContext.getContext().getSession().get(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);    
6、如果想设置点击图片更换验证码,可以加上如下js,需要jquery
[html]  view plain  copy
 print ?
  1. <script type="text/javascript">    
  2.     $(function(){    
  3.         $('#kaptchaImage').click(function () { $(this).attr('src', '/kaptcha.jpg?' + Math.floor(Math.random()*100) ); })    
  4.     });    
  5. </script>    
7、或者来点fade效果
[html]  view plain  copy
 print ?
  1. <script type="text/javascript">    
  2.     $(function() {    
  3.         $('#kaptchaImage').click(    
  4.                 function() {    
  5.                     $(this).hide().attr('src',    
  6.                             'kaptcha.jpg?' + Math.floor(Math.random() * 100)).fadeIn();    
  7.                 });    
  8.     });    
  9. </script>    
8、验证码图片还有很多参数设置

设置方法,在web.xml的servlet中

[html]  view plain  copy
 print ?
  1. <init-param>    
  2.     <param-name>kaptcha.border</param-name>    
  3.     <param-value>no</param-value>    
  4. </init-param>    
Constant描述默认值
kaptcha.border图片边框,合法值:yes , noyes
kaptcha.border.color边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.black
kaptcha.border.thickness边框厚度,合法值:>01
kaptcha.image.width图片宽200
kaptcha.image.height图片高50
kaptcha.producer.impl图片实现类com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl文本实现类com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string文本集合,验证码值从此集合中获取abcde2345678gfynmnpwx
kaptcha.textproducer.char.length验证码长度5
kaptcha.textproducer.font.names字体Arial, Courier
kaptcha.textproducer.font.size字体大小40px.
kaptcha.textproducer.font.color字体颜色,合法值: r,g,b  或者 white,black,blue.black
kaptcha.textproducer.char.space文字间隔2
kaptcha.noise.impl干扰实现类com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color干扰颜色,合法值: r,g,b 或者 white,black,blue.black
kaptcha.obscurificator.impl图片样式:
水纹com.google.code.kaptcha.impl.WaterRipple
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
阴影com.google.code.kaptcha.impl.ShadowGimpy
com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl背景实现类com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from背景颜色渐变,开始颜色light grey
kaptcha.background.clear.to背景颜色渐变,结束颜色white
kaptcha.word.impl文字渲染器com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.keysession keyKAPTCHA_SESSION_KEY
kaptcha.session.datesession dateKAPTCHA_SESSION_DATE

9、

水纹效果


鱼眼效果


阴影效果

以下代码是我在SpringMVC中的代码

[java]  view plain  copy
 print ?
  1. package com.rapido.controller;  
  2.   
  3. import java.awt.image.BufferedImage;  
  4.   
  5. import javax.imageio.ImageIO;  
  6. import javax.servlet.ServletOutputStream;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.springframework.beans.factory.annotation.Autowired;  
  11. import org.springframework.stereotype.Controller;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.servlet.ModelAndView;  
  14.   
  15. import com.google.code.kaptcha.Constants;  
  16. import com.google.code.kaptcha.Producer;  
  17.   
  18. /** 
  19.  * 随机验证码控制层 
  20.  *  
  21.  * 使用kaptcha-2.3.2.jar支持 
  22.  *  
  23.  * Captcha: Completely Automated Public Test to tell Computers and Humans 
  24.  * Apart(全自动区分计算机和人类的图灵测试) 
  25.  *  
  26.  * @author X-rapido 
  27.  *  
  28.  */  
  29. @Controller  
  30. @RequestMapping("/Captcha")  
  31. public class CaptchaRandomCodeController {  
  32.     private Producer captchaProducer = null;  
  33.   
  34.     @Autowired  
  35.     public void setCaptchaProducer(Producer captchaProducer) {  
  36.         this.captchaProducer = captchaProducer;  
  37.     }  
  38.   
  39.     @RequestMapping("/captcha-image")  
  40.     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  41.         response.setDateHeader("Expires"0);// 禁止服务器端缓存  
  42.         // 设置标准的 HTTP/1.1 no-cache headers.  
  43.         response.setHeader("Cache-Control""no-store, no-cache, must-revalidate");  
  44.         // 设置IE扩展 HTTP/1.1 no-cache headers (use addHeader).  
  45.         response.addHeader("Cache-Control""post-check=0, pre-check=0");  
  46.         response.setHeader("Pragma""no-cache");// 设置标准 HTTP/1.0 不缓存图片  
  47.         response.setContentType("image/jpeg");// 返回一个 jpeg 图片,默认是text/html(输出文档的MIMI类型)  
  48.         String capText = captchaProducer.createText();// 为图片创建文本  
  49.           
  50.         // 将文本保存在session中,这里就使用包中的静态变量吧  
  51.         request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);  
  52.           
  53.         BufferedImage bi = captchaProducer.createImage(capText); // 创建带有文本的图片  
  54.         ServletOutputStream out = response.getOutputStream();  
  55.         // 图片数据输出  
  56.         ImageIO.write(bi, "jpg", out);  
  57.         try {  
  58.             out.flush();  
  59.         } finally {  
  60.             out.close();  
  61.         }  
  62.   
  63.         System.out.println("Session 验证码是:" + request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY));  
  64.         return null;  
  65.     }  
  66. }  

applicationContext.xml

[html]  view plain  copy
 print ?
  1. <!-- 验证码配置(也可以做web.xml的Servlet中配置),对应CaptchaRandomCodeController管理生成 -->  
  2. <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
  3.     <property name="config">  
  4.         <bean class="com.google.code.kaptcha.util.Config">  
  5.             <constructor-arg>  
  6.                 <props>  
  7.                     <prop key="kaptcha.border">yes</prop>  
  8.                     <prop key="kaptcha.border.color">105,179,90</prop>  
  9.                     <prop key="kaptcha.image.width">160</prop>  
  10.                     <prop key="kaptcha.image.height">50</prop>  
  11.                     <prop key="kaptcha.session.key">code</prop>  
  12.                     <prop key="kaptcha.textproducer.font.color">red</prop>  
  13.                     <prop key="kaptcha.textproducer.font.size">35</prop>  
  14.                     <prop key="kaptcha.textproducer.char.space">3</prop>  
  15.                     <prop key="kaptcha.textproducer.char.length">5</prop>  
  16.                     <!-- 配置中文 <prop key="kaptcha.textproducer.impl">com.google.code.kaptcha.text.impl.ChineseTextProducer</prop> -->  
  17.                     <prop key="kaptcha.textproducer.font.names">彩云,宋体,楷体,微软雅黑</prop>  
  18.                 </props>  
  19.             </constructor-arg>  
  20.         </bean>  
  21.     </property>  
  22. </bean>  


JSP

[javascript]  view plain  copy
 print ?
  1. <script type="text/javascript">  
  2.     $(function(){  
  3.         // 验证码渐变效果切换  
  4.         $('#kaptchaImage').click(  
  5.            function() {  
  6.                $(this).hide().attr('src','<%=basePath%>Captcha/captcha-image.do?'+ Math.floor(Math.random() * 100)).fadeIn();  
  7.             }  
  8.         );  
  9.     });  
  10. </script>  
[html]  view plain  copy
 print ?
  1. <c:if test="${sessionScope.loginSum >= 3 }">  
  2.     <tr>  
  3.         <td align="right">验证码: <img src="<%=basePath%>Captcha/captcha-image.do" height="25px" width="80px" id="kaptchaImage" /></td>  
  4.         <td><input type="text" name="kaptchaCode" id="kaptchaCode" value="" /></td>  
  5.     </tr>  
  6. </c:if>  

验证码不但可以使用图形还可以使用语音,比如SimpleCaptcha就可以,kaptcha扩展了SimpleCaptcha,等等都可以使用语音验证码,官方中有提供此类的demo可以下载部署在tomcat上使用

使用Java生成验证码的库有很多,比如以下列表中的举例

Java验证码生成库 JCaptcha

Struts验证码插件 JCaptcha4Struts2

Java图形验证码 SimpleCaptcha

Java验证码 kaptcha

Java验证码 patchca

Java验证码生成库 imageRandom

Java验证码库 iCaptcha

Java图片验证库SkewPassImage

Java 验证码 Cage

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值