验证码生成组件--JCaptcha的使用

以下为项目中所用代码,文笔有限,直接上代码。

所需jar包:

是否需要其他依赖包,不详


web.xml

[html]  view plain  copy
  1. <servlet>  
  2.      <servlet-name>Jcaptcha</servlet-name>  
  3.      <servlet-class>com.bkgd.cms.servlet.JcaptchaServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.      <servlet-name>Jcaptcha</servlet-name>  
  7.      <url-pattern>/captcha.svl</url-pattern>  
  8. </servlet-mapping>  

需要一个服务类 生成Image

[java]  view plain  copy
  1. package com.bkgd.cms.servlet;  
  2.   
  3. import java.awt.image.BufferedImage;  
  4. import java.io.IOException;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.ServletOutputStream;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. import org.apache.commons.io.output.ByteArrayOutputStream;  
  12. import org.apache.log4j.Logger;  
  13. import com.octo.captcha.service.CaptchaServiceException;  
  14. import com.sun.image.codec.jpeg.JPEGCodec;  
  15. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  16.   
  17. @SuppressWarnings("serial")  
  18. public class JcaptchaServlet extends HttpServlet {  
  19.     public static final String CAPTCHA_IMAGE_FORMAT = "jpeg";  
  20.   
  21.     private static final Logger log = Logger.getLogger(JcaptchaServlet.class);  
  22.   
  23.     @Override  
  24.     public void init() throws ServletException {  
  25.     }  
  26.   
  27.     /** 
  28.      * @step1 本方法使用Jcaptcha工具生成img图片,并输出到客户端 
  29.      * @step2 将来在用户提交的action中插入下面语句进行验证码的校验:Boolean isResponseCorrect = 
  30.      *        captchaService.validateResponseForID( captchaId, ""); 
  31.      **/  
  32.     @Override  
  33.     protected void doGet(HttpServletRequest request,  
  34.             HttpServletResponse response) throws ServletException, IOException {  
  35.         byte[] captchaChallengeAsJpeg = null;  
  36.         ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();  
  37.         try {  
  38.             // 借助于HttpSession ID存储Captcha ID,开发者也可以借助于其他惟一值  
  39.             String captchaId = request.getSession().getId();  
  40.             // 获得GMailEngine使用的图片内容  
  41.             BufferedImage challenge = JCaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId, request.getLocale());  
  42.             // 输出JPEG格式  
  43.             JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);  
  44.             jpegEncoder.encode(challenge);  
  45.         } catch (IllegalArgumentException e) {  
  46.             log.error(e);  
  47.             response.sendError(HttpServletResponse.SC_NOT_FOUND);  
  48.             return;  
  49.         } catch (CaptchaServiceException e) {  
  50.             log.error(e);  
  51.             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);  
  52.             return;  
  53.         }  
  54.         captchaChallengeAsJpeg = jpegOutputStream.toByteArray();  
  55.         response.setHeader("Cache-Control""no-store");  
  56.         response.setHeader("Pragma""no-cache");  
  57.         response.setDateHeader("Expires"0);  
  58.         // 输出JPEG图片  
  59.         response.setContentType("image/jpeg");  
  60.         ServletOutputStream responseOutputStream = response.getOutputStream();  
  61.         responseOutputStream.write(captchaChallengeAsJpeg);  
  62.         responseOutputStream.flush();  
  63.         responseOutputStream.close();  
  64.     }  
  65. }  

JCaptchaServiceSingleton

[java]  view plain  copy
  1. package com.bkgd.cms.servlet;  
  2.   
  3. import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;  
  4. import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;  
  5. import com.octo.captcha.service.image.ImageCaptchaService;  
  6.   
  7. public class JCaptchaServiceSingleton {  
  8.     private static ImageCaptchaService imageCaptchaService = new DefaultManageableImageCaptchaService(  
  9.             new FastHashMapCaptchaStore(), new GMailEngine(), 180100000,  
  10.             75000);  
  11.   
  12.     public static ImageCaptchaService getInstance() {  
  13.         return imageCaptchaService;  
  14.     }  
  15. }  

验证码样式的图片引擎GMailEngine

[java]  view plain  copy
  1. package com.bkgd.cms.servlet;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.Font;  
  5. import java.awt.image.ImageFilter;  
  6.   
  7. import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;  
  8. import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;  
  9. import com.octo.captcha.component.image.color.RandomListColorGenerator;  
  10. import com.octo.captcha.component.image.deformation.ImageDeformation;  
  11. import com.octo.captcha.component.image.deformation.ImageDeformationByFilters;  
  12. import com.octo.captcha.component.image.fontgenerator.FontGenerator;  
  13. import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;  
  14. import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;  
  15. import com.octo.captcha.component.image.textpaster.TextPaster;  
  16. import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;  
  17. import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;  
  18. import com.octo.captcha.component.image.wordtoimage.WordToImage;  
  19. import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;  
  20. import com.octo.captcha.component.word.wordgenerator.WordGenerator;  
  21. import com.octo.captcha.engine.image.ListImageCaptchaEngine;  
  22. import com.octo.captcha.image.gimpy.GimpyFactory;  
  23.   
  24. /** 
  25.  * 仿照JCaptcha2.0编写GMail验证码样式的图片引擎. 
  26.  */  
  27. public class GMailEngine extends ListImageCaptchaEngine {  
  28.     @Override  
  29.     protected void buildInitialFactories() {  
  30.         int minWordLength = 4;  
  31.         int maxWordLength = 4;  
  32.         int fontSize = 26;  
  33.         int imageWidth = 110;  
  34.         int imageHeight = 50;  
  35.         //在页面上将显示的内容  
  36.         WordGenerator dictionnaryWords = new RandomWordGenerator("1234567890");  
  37.         TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,  
  38.                 maxWordLength, new RandomListColorGenerator(  
  39.                         new Color[] { new Color(000) }),  
  40.                 new TextDecorator[] {});  
  41.         BackgroundGenerator background = new UniColorBackgroundGenerator(  
  42.                 imageWidth, imageHeight, Color.white);  
  43.         FontGenerator font = new RandomFontGenerator(fontSize, fontSize,  
  44.                 new Font[] { new Font("nyala", Font.BOLD, fontSize),  
  45.                         new Font("Bell MT", Font.PLAIN, fontSize),  
  46.                         new Font("Credit valley", Font.BOLD, fontSize) });  
  47.   
  48.         ImageDeformation postDef = new ImageDeformationByFilters(new ImageFilter[] {});  
  49.         ImageDeformation backDef = new ImageDeformationByFilters(new ImageFilter[] {});  
  50.         ImageDeformation textDef = new ImageDeformationByFilters(new ImageFilter[] {});  
  51.   
  52.         WordToImage word2image = new DeformedComposedWordToImage(font,  
  53.                 background, randomPaster, backDef, textDef, postDef);  
  54.         addFactory(new GimpyFactory(dictionnaryWords, word2image));  
  55.     }  
  56.   
  57. }  

前台JSP

[html]  view plain  copy
  1. <input class="input" type="text" name="checkCode" id="checkCode" value=""/>  
  2. <img id="captcha" src="captcha.svl" onclick="this.src='captcha.svl?d='+new Date()*1"/>  

后台Action验证

[java]  view plain  copy
  1. HttpServletRequest request = ServletActionContext.getRequest();  
  2. String sessID = request.getSession().getId();  
  3. Boolean isResponseCorrect = JCaptchaServiceSingleton.getInstance().validateResponseForID(sessID, checkCode);  
  4. if(isResponseCorrect){  
  5.     return "true"  
  6. }else{  
  7.     return "false"    
  8. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值