zoukankan      html  css  js  c++  java
  • 验证码之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

  • 相关阅读:
    bug_ _ 常见的bug1
    键盘-App监听软键盘按键的三种方式
    listview--记录ListView滚动停止位置与设置显示位置
    android shape的使用
    转-android图片降低图片大小保持图片清晰的方法
    转-Android SHA1与Package获取方式
    Android listview中使用checkbox
    保存恢复临时信-Android 中使用onSaveInstanceState和onRestoreInstanceState
    转-Android客户端和服务端如何使用Token和Session
    转-Activity中使用orientation属性讲解及需注意的问题
  • 原文地址:https://www.cnblogs.com/panchanggui/p/10695633.html
Copyright © 2011-2022 走看看