验证码之SimpleCaptcha

      在captcha中,两个比较著名的框架验证码有Jcaptcha和simpleCaptcha,Jcaptcha太庞大了,所以我选择了简单的SimpleCaptcha 
      simpleCaptcha是一个用于随机生成验证码的一个java框架,它为验证码提供简单的实现。提供很多图形的自定 
义。它对中文也提供了很好的支持 
     下面将简单的将验证码加入到你的项目中 
         1.  下载SimpleCapcha  http://simplecaptcha.sourceforge.net 
         2.   复制jar文件到你项目的WEB-INF/lib目录下 
         3.  在你web.xml中增加以下配置: 
Java代码  收藏代码
  1. <servlet>    
  2.         <servlet-name>StickyCaptcha</servlet-name>    
  3.         <servlet-class>nl.captcha.servlet.StickyCaptchaServlet</servlet-class>    
  4.         <init-param>    
  5.             <param-name>width</param-name>    
  6.             <param-value>250</param-value>    
  7.         </init-param>    
  8.         <init-param>    
  9.             <param-name>height</param-name>    
  10.             <param-value>75</param-value>    
  11.         </init-param>    
  12.     </servlet>    
  13.     
  14.     <servlet-mapping>     
  15.         <servlet-name>StickyCaptcha</servlet-name>    
  16.         <url-pattern>/stickyImg</url-pattern>    
  17.     </servlet-mapping>    

         4.  重启你的服务器。然后访问http://localhost:8080/stic就可以看到效果了  

         是不是感觉很简单呢?下面做几个界面出来看看效果吧 

        5.   现在创建一个jsp叫做captcha.jsp,将下面代码放入你的你的<body>中 

Java代码  收藏代码
  1.  <img src="/stickyImg" />    
  2.     <form action="/captchaSubmit.jsp" method="post">    
  3.         <input name="answer" />    
  4.         <input type="submit" name="submit"/>    
  5. </form>  
  
         6.   创建captchaSumit.jsp页面 
Java代码  收藏代码
  1. <%@ page import="nl.captcha.Captcha" %>    
  2.     ...    
  3.     <%    
  4.     Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);    
  5.     request.setCharacterEncoding("UTF-8");    
  6.     String answer = request.getParameter("answer");    
  7.     if (captcha.isCorrect(answer)) { %>    
  8.         <b>Correct!</b>    
  9. <% } %>   

         7.   浏览captcha.jsp.页面,然后你可以看到效果了。这样一个简单的验证码就很快加入到你的项目中了。超级简单吧。 

说明: 
web.xml中: 

      1)过滤器类nl.captcha.servlet.StickyCaptchaServlet,生成图片是交给这个类去处理的。其实还有其他几个过滤器也可以供我们来调用。 

      StickyCaptchaServlet:随机生成5个字符(数字+字母) 结果会放在session中存储,刷新页面不会改变值,继承simpleCaptchaServlet。 

      ChineseCaptchaServlet :随机生成5个中文字符,结果也会放入session中存储,刷新页面不会改变值,继承simpleCaptchaServlet。 

      SimpleCaptchaServlet: :随机数生成5个字符(数字+字母)放在page中,页面刷新会重新生成。 

      2)width和height分别是图片的宽度和高度。 

如果你还对验证码有更高的要求,比如图片的大小,颜色,背景等等,那么就需要自己去扩展。 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值