jcaptcha 验证码自定义扩展应用

对于验证码的各个插件大家都应该熟悉不少了,但是我比较喜欢用jcaptcha这个插件,下面我演示自己的扩展使用

 

 

我使用的是DefaultManageableImageCaptchaService实现类根据源码的实现类改编过来的,至于其他的实现类有兴趣的可以自己去看下文档

 

然后就开始写我们的扩展类ImageCaptchaEngineExtend,该类要继承ListImageCaptchaEngine

 

[java]  view plain  copy
 
  1. /** 
  2.  * 自定义验证码内容样式 
  3.  *  
  4.  * @author shadow 
  5.  * @email [email protected] 
  6.  */  
  7.   
  8. public class ImageCaptchaEngineExtend extends ListImageCaptchaEngine {  
  9.              
  10.          protected void buildInitialFactories() {  
  11.   
  12.         // build filters  
  13.         WaterFilter water = new WaterFilter();  
  14.   
  15.         water.setAmplitude(3d);  
  16.         water.setAntialias(true);  
  17.         water.setPhase(20d);  
  18.         water.setWavelength(70d);  
  19.   
  20.         ImageDeformation backDef = new ImageDeformationByFilters(  
  21.                 new ImageFilter[] {});  
  22.         ImageDeformation textDef = new ImageDeformationByFilters(  
  23.                 new ImageFilter[] {});  
  24.         ImageDeformation postDef = new ImageDeformationByFilters(  
  25.                 new ImageFilter[] { water });  
  26.   
  27.         // word generator  
  28.         WordGenerator dictionnaryWords = new RandomWordGenerator(  
  29.                 "abcdefhjkmnprstuvwxyz23456789");  
  30.         // wordtoimage components  
  31.         RandomRangeColorGenerator colors = new RandomRangeColorGenerator(  
  32.                 new int[] { 0150 }, new int[] { 0150 },  
  33.                 new int[] { 0150 });  
  34.   
  35.         // Arial,Tahoma,Verdana,Helvetica,宋体,黑体,幼圆  
  36.         Font[] fonts = new Font[] { new Font("Arial"015),  
  37.                 new Font("Tahoma"015), new Font("Verdana"015),  
  38.                 new Font("Helvetica"015), new Font("宋体"015),  
  39.                 new Font("黑体"015), new Font("幼圆"015) };  
  40.   
  41.         // 设置字符以及干扰线  
  42.         RandomRangeColorGenerator lineColors = new RandomRangeColorGenerator(  
  43.                 new int[] { 150255 }, new int[] { 150255 }, new int[] {  
  44.                         150255 });  
  45.   
  46.         TextPaster randomPaster = new DecoratedRandomTextPaster(new Integer(4),  
  47.                 new Integer(4), colors, true,  
  48.                 new TextDecorator[] { new LineTextDecorator(new Integer(1),  
  49.                         lineColors) });  
  50.         BackgroundGenerator back = new UniColorBackgroundGenerator(new Integer(  
  51.                 140), new Integer(45), Color.white);  
  52.   
  53.         FontGenerator shearedFont = new RandomFontGenerator(new Integer(30),  
  54.                 new Integer(0), fonts);  
  55.         // word2image 1  
  56.         WordToImage word2image;  
  57.         word2image = new DeformedComposedWordToImage(shearedFont, back,  
  58.                 randomPaster, backDef, textDef, postDef);  
  59.   
  60.         this.addFactory(new GimpyFactory(dictionnaryWords, word2image));  
  61.   
  62.     }  
  63. }  

然后写个单例调用我们的实现类

 

[java]  view plain  copy
 
  1. /** 
  2.  * Jcaptcha单例模式 
  3.  *  
  4.  * @author shadow 
  5.  * @email [email protected] 
  6.  * @create 2012.04.28 
  7.  */  
  8. public class CaptchaServiceSingleton {  
  9.   
  10.     // 不允许构造实例  
  11.     private CaptchaServiceSingleton() {  
  12.     }  
  13.   
  14.     private static ImageCaptchaService instance = null;  
  15.   
  16.     /** 
  17.      * SimpleListSoundCaptchaEngine //还可以用声音 SpellerSoundCaptchaEngine 
  18.      * SpellerSoundCaptchaEngine DefaultGimpyEngineCaptcha 
  19.      * BaffleListGimpyEngineCaptcha BasicListGimpyEngineCaptcha 
  20.      * DeformedBaffleListGimpyEngineCaptcha DoubleRandomListGimpyEngineCaptcha 
  21.      * SimpleListImageCaptchaEngineCaptcha SimpleFishEyeEngineCaptcha 
  22.      */  
  23.     // 传入样式类  
  24.     static {  
  25.         instance = new DefaultManageableImageCaptchaService(  
  26.                 new FastHashMapCaptchaStore(), new ImageCaptchaEngineExtend(),  
  27.                 18010000075000);  
  28.     }  
  29.   
  30.     public static ImageCaptchaService getInstance() {  
  31.         return instance;  
  32.     }  
  33.   
  34. }  



 

 

再来个servlet类

 

[java]  view plain  copy
 
  1. @SuppressWarnings("serial")  
  2. public class ImageCaptchaServlet extends HttpServlet {  
  3.   
  4.     public void init(ServletConfig servletConfig) throws ServletException {  
  5.         super.init(servletConfig);  
  6.     }  
  7.   
  8.     protected void doGet(HttpServletRequest httpServletRequest,  
  9.             HttpServletResponse httpServletResponse) throws ServletException,  
  10.             IOException {  
  11.   
  12.         byte[] captchaChallengeAsJpeg = null;  
  13.         // the output stream to render the captcha image as jpeg into  
  14.         ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();  
  15.         try {  
  16.             // get the session id that will identify the generated captcha.  
  17.             // the same id must be used to validate the response, the session id  
  18.             // is a good candidate!  
  19.             String captchaId = httpServletRequest.getSession().getId();  
  20.             // call the ImageCaptchaService getChallenge method  
  21.             BufferedImage challenge = CaptchaServiceSingleton.getInstance()  
  22.                     .getImageChallengeForID(captchaId,  
  23.                             httpServletRequest.getLocale());  
  24.   
  25.             // a jpeg encoder  
  26.             JPEGImageEncoder jpegEncoder = JPEGCodec  
  27.                     .createJPEGEncoder(jpegOutputStream);  
  28.             jpegEncoder.encode(challenge);  
  29.         } catch (IllegalArgumentException e) {  
  30.             httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);  
  31.             return;  
  32.         } catch (CaptchaServiceException e) {  
  33.             httpServletResponse  
  34.                     .sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);  
  35.             return;  
  36.         }  
  37.   
  38.         captchaChallengeAsJpeg = jpegOutputStream.toByteArray();  
  39.   
  40.         // flush it in the response  
  41.         httpServletResponse.setHeader("Cache-Control""no-store");  
  42.         httpServletResponse.setHeader("Pragma""no-cache");  
  43.         httpServletResponse.setDateHeader("Expires"0);  
  44.         httpServletResponse.setContentType("image/jpeg");  
  45.         ServletOutputStream responseOutputStream = httpServletResponse  
  46.                 .getOutputStream();  
  47.         responseOutputStream.write(captchaChallengeAsJpeg);  
  48.         responseOutputStream.flush();  
  49.         responseOutputStream.close();  
  50.     }  
  51. }  



 

接着我们来配置web.xml

 

 

[java]  view plain  copy
 
  1. <!-- jcaptcha filter -->  
  2.     <servlet>  
  3.         <servlet-name>jcaptcha</servlet-name>  
  4.         <servlet-class>  
  5.             com.shadow.extras.jcaptcha.ImageCaptchaServlet  
  6.         </servlet-class>  
  7.         <load-on-startup>0</load-on-startup>  
  8.     </servlet>  
  9.     <servlet-mapping>  
  10.         <servlet-name>jcaptcha</servlet-name>  
  11.         <url-pattern>/jcaptcha</url-pattern>  
  12.     </servlet-mapping>  

猜你喜欢

转载自fengbin2005.iteye.com/blog/2327983