验证码之SimpleCaptcha (二)

上回说到了简单的使用simpleCaptcha,这次我们这次我们将讲解扩张simpleCaptcha。 
      回到正题,我们需要一些自定义的验证码,比如验证码的字体大小,背景,颜色等等,默认的验证码是无法满足我们的需求的。所以我们得自己去实现。我这几提供了简单的扩展,如果大家有什么好的建议大家一起来探讨。 
      自定义过滤器:SimpleCaptchaFilter 

Java代码   收藏代码
  1. package com.xyj.com.tool.captcha;  
  2.   
  3. import static nl.captcha.Captcha.NAME;  
  4.   
  5.   
  6. import java.awt.Color;  
  7. import java.awt.Font;  
  8. import java.io.IOException;  
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11.   
  12. import javax.servlet.ServletException;  
  13. import javax.servlet.http.HttpServlet;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16. import javax.servlet.http.HttpSession;  
  17.   
  18. import nl.captcha.Captcha;  
  19. import nl.captcha.Captcha.Builder;  
  20. import nl.captcha.backgrounds.BackgroundProducer;  
  21. import nl.captcha.backgrounds.FlatColorBackgroundProducer;  
  22. import nl.captcha.backgrounds.GradiatedBackgroundProducer;  
  23. import nl.captcha.backgrounds.SquigglesBackgroundProducer;  
  24. import nl.captcha.backgrounds.TransparentBackgroundProducer;  
  25. import nl.captcha.gimpy.BlockGimpyRenderer;  
  26. import nl.captcha.gimpy.DropShadowGimpyRenderer;  
  27. import nl.captcha.gimpy.FishEyeGimpyRenderer;  
  28. import nl.captcha.gimpy.RippleGimpyRenderer;  
  29. import nl.captcha.gimpy.ShearGimpyRenderer;  
  30. import nl.captcha.servlet.CaptchaServletUtil;  
  31. import nl.captcha.servlet.SimpleCaptchaServlet;  
  32. import nl.captcha.text.producer.ChineseTextProducer;  
  33. import nl.captcha.text.producer.DefaultTextProducer;  
  34. import nl.captcha.text.renderer.ColoredEdgesWordRenderer;  
  35. import nl.captcha.text.renderer.DefaultWordRenderer;  
  36. import nl.captcha.text.renderer.WordRenderer;  
  37.   
  38. /** 
  39.  * @className:SimpleCaptchaFilter.java 
  40.  * @classDescription: 扩展默认的simpleCaptcha 
  41.  * @author:xiayingjie 
  42.  * @createTime:2010-10-20 
  43.  */  
  44.   
  45. public class SimpleCaptchaFilter extends HttpServlet{  
  46.        
  47.       private static final String PARAM_HEIGHT = "height"; //高度 默认为50  
  48.     
  49.       private static final String PARAM_WIDTH = "width";//宽度 默认为200  
  50.         
  51.       private static final String PAEAM_NOISE="noise";//干扰线条 默认是没有干扰线条  
  52.         
  53.       private static final String PAEAM_TEXT="text";//文本  
  54.   
  55.       protected int _width = 200;  
  56.       protected int _height = 50;  
  57.       protected boolean _noise=false;  
  58.       protected String _text=null;  
  59.         
  60.       /** 
  61.        * 初始化过滤器.将配置文件的参数文件赋值 
  62.        * @throws ServletException 
  63.        */  
  64.       @Override  
  65.         public void init() throws ServletException {  
  66.             if (getInitParameter(PARAM_HEIGHT) != null) {  
  67.                 _height = Integer.valueOf(getInitParameter(PARAM_HEIGHT));  
  68.             }  
  69.               
  70.             if (getInitParameter(PARAM_WIDTH) != null) {  
  71.                 _width = Integer.valueOf(getInitParameter(PARAM_WIDTH));  
  72.             }  
  73.               
  74.             if (getInitParameter(PAEAM_NOISE) != null) {  
  75.                 _noise = Boolean.valueOf(getInitParameter(PAEAM_NOISE));  
  76.             }  
  77.               
  78.             if (getInitParameter(PAEAM_NOISE) != null) {  
  79.                 _text = String.valueOf(getInitParameter(PAEAM_TEXT));  
  80.             }  
  81.         }  
  82.         
  83.       /** 
  84.        * 因为获取图片只会有get方法 
  85.        */  
  86.        @Override  
  87.       public void doGet(HttpServletRequest req, HttpServletResponse resp)  
  88.             throws ServletException, IOException {  
  89.              
  90.            Builder builder=new Captcha.Builder(_width, _height);  
  91.            //增加边框  
  92.            builder.addBorder();  
  93.            //是否增加干扰线条  
  94.            if(_noise==true)  
  95.                builder.addNoise();  
  96.            //----------------自定义字体大小-----------  
  97.            //自定义设置字体颜色和大小 最简单的效果 多种字体随机显示  
  98.            List<Font> fontList = new ArrayList<Font>();  
  99. //         fontList.add(new Font("Arial", Font.HANGING_BASELINE, 40));//可以设置斜体之类的  
  100.            fontList.add(new Font("Courier", Font.BOLD, 40));      
  101.            DefaultWordRenderer dwr=new DefaultWordRenderer(Color.green,fontList);  
  102.              
  103.            //加入多种颜色后会随机显示 字体空心  
  104. //         List<Color> colorList=new ArrayList<Color>();  
  105. //         colorList.add(Color.green);  
  106. //         colorList.add(Color.white);  
  107. //         colorList.add(Color.blue);  
  108. //         ColoredEdgesWordRenderer cwr= new ColoredEdgesWordRenderer(colorList,fontList);  
  109.              
  110.            WordRenderer wr=dwr;  
  111.            //增加文本,默认为5个随机字符.  
  112.            if(_text==null){  
  113.                builder.addText();  
  114.            }else{  
  115.                String[]ts=_text.split(",");  
  116.                for(int i=0;i<ts.length;i++){  
  117.                    String[] ts1=ts[i].split(":");  
  118.                    if("chinese".equals(ts1[0])){  
  119.                        builder.addText(new ChineseTextProducer(Integer.parseInt(ts1[1])),wr);  
  120.                    }else if("number".equals(ts1[0])){  
  121.                        //这里没有0和1是为了避免歧义 和字母I和O  
  122.                        char[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };  
  123.                        builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]),numberChar),wr);  
  124.                    }else if("word".equals(ts1[0])){  
  125.                        //原理同上  
  126.                        char[] numberChar = new char[] {'a', 'b', 'c', 'd',  
  127.                                 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r', 'w', 'x', 'y' };  
  128.                        builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]),numberChar),wr);  
  129.                    }else{  
  130.                        builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1])),wr);  
  131.                    }  
  132.                }  
  133.                  
  134.            }  
  135.              
  136.          //--------------添加背景-------------  
  137.            //设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色  
  138.            GradiatedBackgroundProducer gbp=new GradiatedBackgroundProducer();  
  139.            gbp.setFromColor(Color.yellow);  
  140.            gbp.setToColor(Color.red);  
  141.            //无渐进效果,只是填充背景颜色  
  142. //         FlatColorBackgroundProducer  fbp=new FlatColorBackgroundProducer(Color.red);  
  143.            //加入网纹--一般不会用  
  144. //         SquigglesBackgroundProducer  sbp=new SquigglesBackgroundProducer();  
  145.            // 没发现有什么用,可能就是默认的  
  146. //         TransparentBackgroundProducer tbp = new TransparentBackgroundProducer();  
  147.           
  148.              
  149.            builder.addBackground(gbp);  
  150.            //---------装饰字体---------------  
  151.            // 字体边框齿轮效果 默认是3  
  152.            builder.gimp(new BlockGimpyRenderer(1));  
  153.            //波纹渲染 相当于加粗  
  154. //         builder.gimp(new RippleGimpyRenderer());  
  155.            //修剪--一般不会用  
  156. //         builder.gimp(new ShearGimpyRenderer(Color.red));  
  157.            //加网--第一个参数是横线颜色,第二个参数是竖线颜色  
  158. //         builder.gimp(new FishEyeGimpyRenderer(Color.red,Color.yellow));  
  159.            //加入阴影效果 默认3,75   
  160. //         builder.gimp(new DropShadowGimpyRenderer());  
  161.            //创建对象  
  162.           Captcha captcha =  builder .build();  
  163.              
  164.        CaptchaServletUtil.writeImage(resp, captcha.getImage());  
  165.        req.getSession().setAttribute(NAME, captcha);  
  166.     }  
  167. }  



代码可能稍微有点长,代码里面基本上都写了注释。所以这里就不再重复描述功能了 
2.web.wml需要将过滤器改成以上过滤器。 

Java代码   收藏代码
  1. <servlet>  
  2.       <servlet-name>StickyCaptcha</servlet-name>  
  3.       <servlet-class>com.xyj.com.tool.captcha.SimpleCaptchaFilter</servlet-class>  
  4.       <init-param>  
  5.           <param-name>width</param-name>  
  6.           <param-value>200</param-value>  
  7.       </init-param>  
  8.       <init-param>  
  9.           <param-name>height</param-name>  
  10.           <param-value>50</param-value>  
  11.       </init-param>  
  12.       <!-- 不加干扰线 -->  
  13.       <init-param>  
  14.           <param-name>noise</param-name>  
  15.           <param-value>false</param-value>  
  16.       </init-param>  
  17.       <!-- 意思是3个单词,3个数字 -->  
  18.       <init-param>  
  19.           <param-name>text</param-name>  
  20.           <param-value>word:3,number:3</param-value>  
  21.       </init-param>  
  22.   </servlet>  



说明: 
    1.对于SimpleCaptchaFilterdoGet()方法中为什么有那么多注释了的方法,是因为方便以后我更好的改动我的代码,如果我现在想要另外一种效果,只需要将某些注释去掉和注释掉现有部分代码。 
    2.对于使用的比较多的功能我就将它们放到前端进行可配。比如:text,以及noise.如果需要改效果就改一下源代码好了。 
   

验证码之SimpleCaptcha (一) 
http://www.iteye.com/topic/790024#1719204 

原文:https://www.iteye.com/topic/790038

猜你喜欢

转载自www.cnblogs.com/panchanggui/p/10695633.html