`
xuxingyin
  • 浏览: 48513 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

利用开源组件制作验证码 SimpleCaptcha 【转】

阅读更多

 

转载:http://blog.ntsky.com/simplecaptcha.html

使用SimpleCaptcha可以方便灵活的生成各种验证码。

下载SimpleCaptcha : http://sourceforge.net/project/platformdownload.php?group_id=147810&sel_platform=13579

添加到ClassPath中,在web.xml中的设置:

XML/HTML代码
Xml代码 复制代码
  1. < servlet >      
  2.      < servlet-name > Captcha </ servlet-name >       
  3.      < servlet-class > nl.captcha.servlet.CaptchaServlet </ servlet-class >       
  4.      < init-param >       
  5.          < param-name > cap.font.color </ param-name >       
  6.          < param-value > 0,0,255 </ param-value >       
  7.      </ init-param >       
  8.      < init-param >       
  9.          < param-name > cap.char.arr </ param-name >       
  10.          < param-value > 1,2,3,4,5,6,7,8,9,0 </ param-value >       
  11.      </ init-param >       
  12.      < init-param >       
  13.          < param-name > cap.border </ param-name >       
  14.          < param-value > yes </ param-value >       
  15.      </ init-param >               
  16.      < init-param >       
  17.          < param-name > cap.border.c </ param-name >       
  18.          < param-value > black </ param-value >       
  19.      </ init-param >               
  20.      < init-param >       
  21.          < param-name > cap.border.th </ param-name >       
  22.          < param-value > 1 </ param-value >       
  23.      </ init-param >           
  24.      < init-param >       
  25.          < param-name > cap.background.c.to </ param-name >       
  26.          < param-value > 255,255,255 </ param-value >       
  27.      </ init-param >       
  28.      < init-param >       
  29.          < param-name > cap.background.c.from </ param-name >       
  30.          < param-value > 255,255,255 </ param-value >       
  31.      </ init-param >                   
  32. </ servlet >       
  33. < servlet-mapping >       
  34.      < servlet-name > Captcha </ servlet-name >       
  35.      < url-pattern > /servlet/Captcha.jpg </ url-pattern >       
  36. </ servlet-mapping >      
<servlet>  
    <servlet-name>Captcha</servlet-name>   
    <servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>   
    <init-param>   
        <param-name>cap.font.color</param-name>   
        <param-value>0,0,255</param-value>   
    </init-param>   
    <init-param>   
        <param-name>cap.char.arr</param-name>   
        <param-value>1,2,3,4,5,6,7,8,9,0</param-value>   
    </init-param>   
    <init-param>   
        <param-name>cap.border</param-name>   
        <param-value>yes</param-value>   
    </init-param>           
    <init-param>   
        <param-name>cap.border.c</param-name>   
        <param-value>black</param-value>   
    </init-param>           
    <init-param>   
        <param-name>cap.border.th</param-name>   
        <param-value>1</param-value>   
    </init-param>       
    <init-param>   
        <param-name>cap.background.c.to</param-name>   
        <param-value>255,255,255</param-value>   
    </init-param>   
    <init-param>   
        <param-name>cap.background.c.from</param-name>   
        <param-value>255,255,255</param-value>   
    </init-param>               
</servlet>   
<servlet-mapping>   
    <servlet-name>Captcha</servlet-name>   
    <url-pattern>/servlet/Captcha.jpg</url-pattern>   
</servlet-mapping>

html中增加<img style="border:0;" id="captchaImg" src="/servlet/Captcha.jpg" border="0"/>

验证码效果图片:

Java代码中可以通过req.getSession().getAttribute("SIMPLE_CAPCHA_SESSION_KEY")来取得验证码的值。

注意:

LINUX操作系统没有装x11的情况下,需要注释nl.captcha.text.imp.DefaultWordRenderer 类的

XML/HTML代码
Xml代码 复制代码
  1. /*      
  2. GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment();       
  3.                   
  4.    GraphicsDevice gd = ge .getDefaultScreenDevice();       
  5.    GraphicsConfiguration gc = gd .getDefaultConfiguration();       
  6. */    
/*   
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();    
               
  GraphicsDevice gd = ge.getDefaultScreenDevice();    
  GraphicsConfiguration gc = gd.getDefaultConfiguration();    
*/
  1. 不然会有错误。

---------------------------------------------------------------------------------------------------------------------------

jsp验证码制作

  介绍两个功能强大的开源制作验证码组件SimpleCaptcha,JCAPTCHA。

  一、SimpleCaptcha搜狐邮箱注册时就使用了该组件,主页:
  http://simplecaptcha.sourceforge.net/index.html

example


1.配置
   将下载的jar文件放置工程的lib目录下,打开工程的web.xml文件加上相应的配置
<servlet>
   <servlet-name>Captcha</servlet-name>
   <servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>
   <!--边框显示参数-->
   <init-param>
    <param-name>cap.border</param-name>
    <param-value>yes</param-value>
   </init-param>

   <!-- 设置图片边框色 -->
   <init-param>
    <param-name>cap.border.c</param-name>
    <param-value>green</param-value>
   </init-param>

   <!-- 边框粗细-->
   <init-param>
    <param-name>cap.border.th</param-name>
    <param-value>1</param-value>
   </init-param>

   <!-- the image producer. Currently only one-->
   <init-param>
    <param-name>cap.cap.producer</param-name>
    <param-value>
     nl.captcha.obscurity.imp.DefaultCaptchaIml
    </param-value>
   </init-param>

   <!-- 设置验证码的内容 -->
   <init-param>
    <param-name>cap.text.producer</param-name>
    <!--<param-value>Default</param-value>-->
    <!-- 此处是我自定义的一个显示中文的类 -->
    <param-value>org.ChineseTextProducer</param-value>
   </init-param>

   <!-- 此处可不定义,可在自定义类中定义所有的要显示的内容 -->
   <init-param>
    <param-name>cap.char.arr</param-name>
    <param-value>
     2,3,4,6,7,8,9,a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,x,y,z
    </param-value>
   </init-param>

   <!-- 设置图片显示内容长度 -->
   <init-param>
    <param-name>cap.char.arr.l</param-name>
    <param-value>4</param-value>
   </init-param>

   <init-param>
    <param-name>cap.font.arr</param-name>
    <!-- 如果使用中文时设置成中文的字体 -->
    <param-value>
     Arial,Helvetica,Courier,TimesRoman,宋体,黑体
    </param-value>
   </init-param>

   <!-- 设置字体大小 -->
   <init-param>
    <param-name>cap.font.size</param-name>
    <param-value>30</param-value>
   </init-param>

   <!-- 设置图片字体色 -->
   <init-param>
    <param-name>cap.font.color</param-name>
    <param-value>white</param-value>
   </init-param>
  
   <!-- 扭曲; 曲解; 变形 begin -->
   <!-- 图片效果1
   <init-param>
    <param-name>cap.obscurificator</param-name>
    以下任选一
    <param-value>nl.captcha.obscurity.imp.ShadowGimpyImp</param-value>
    <param-value>nl.captcha.obscurity.imp.WaterRiple</param-value>
    <param-value>nl.captcha.sandbox.TestGimpyImp</param-value>
   </init-param>
   -->
   <init-param>
    <param-name>cap.obscurificator</param-name>
    <param-value>org.FishEyeGimpyImp</param-value>
   </init-param>

   <init-param>
    <param-name>cap.border</param-name>
    <param-value>no</param-value>
   </init-param>

   <init-param>
    <param-name>cap.char.arr.l</param-name>
    <param-value>6</param-value>
   </init-param>

   <init-param>
    <param-name>cap.background.c.to</param-name>
    <param-value>white</param-value>
   </init-param>
  
   <init-param>
    <param-name>cap.background.c.from</param-name>
    <param-value>white</param-value>
   </init-param>
   <!--扭曲; 曲解; 变形 end 不想要这种效果可注释以上代码-->


   <init-param>
    <param-name>cap.distortionImp</param-name>
    <param-value />
   </init-param>

   <init-param>
    <param-name>cap.backgroundImp</param-name>
    <param-value />
   </init-param>

   <!-- 此处色为渐变的色 -->
   <init-param>
    <param-name>cap.background.c.to</param-name>
    <param-value>black</param-value>
   </init-param>

   <!-- 图片左边色 -->
   <init-param>
    <param-name>cap.background.c.from</param-name>
    <param-value>black</param-value>
   </init-param>

   <!--干扰线实现类-->
   <init-param>
    <param-name>cap.noiseImp</param-name>
    <param-value>nl.captcha.obscurity.imp.DefaultNoiseImp</param-value>
   </init-param>

   <!-- 干扰线色
   <init-param>
    <param-name>cap.noise.c</param-name>
    <param-value>255,245,219</param-value>
   </init-param>
   -->
</servlet>
<servlet-mapping>
   <servlet-name>Captcha</servlet-name>
   <url-pattern>/Captcha.jpg</url-pattern>
</servlet-mapping>
   以上配置可根据喜好设置。

2、调用显示

在要显示验证码的页面中加入<img src="Captcha.jpg">即可显示生成的验证码

3、后台验证
验证非常简单,通过session.getAttribute(nl.captcha.servlet.Constants.SIMPLE_CAPCHA_SESSION_KEY);即可得到组件生成
的验证码,然后与前台传递的用户填写的内容比较即可。

注:如果要自定义验证码的内容可以继承DefaultTextCreator类,覆写getText()方法即可,方法返回的是一个字符串。

  二、JCAPTCHA,该组件功能非常强大,可以生成word、图片、声音等验证码。主页:
http://forge.octo.com/jcaptcha/confluence/display/general/Home
http://jcaptcha.sourceforge.net/

example
更多实例可以查看:http://forge.octo.com/jcaptcha/confluence/display/general/Samples+tests


1、配置
下载JCAPTCHA后将jcaptcha.jar和commons-collections-2.1以上.jar(单独下载,地址:http://commons.apache.org/collections/ )放置工程lib目录下。

2、Implement a CaptchaService

import com.octo.captcha.service.image.ImageCaptchaService;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

public class CaptchaServiceSingleton {

     private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();

     public static ImageCaptchaService getInstance(){
        return instance;
      }
}

3、编写一个产生验证码的servlet

public class ImageCaptchaServlet extends HttpServlet {

protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
        throws ServletException, IOException {

        byte[] captchaChallengeAsJpeg = null;
     
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
         String captchaId = httpServletRequest.getSession().getId();
       
        BufferedImage challenge =
                    CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
                            httpServletRequest.getLocale());
            JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
        } catch (IllegalArgumentException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        } catch (CaptchaServiceException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream =
                httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
    }
}


4、将servlet添加到web.xml文件中
<servlet>
         <servlet-name>jcaptcha</servlet-name>
        <servlet-class>ImageCaptchaServlet</servlet-class>
         <load-on-startup>0</load-on-startup>
        </servlet>

<servlet-mapping>
        <servlet-name>jcaptcha</servlet-name>
         <url-pattern>/jcaptcha</url-pattern>
</servlet-mapping>

5、在页面中显示
<img src="jcaptcha">
<input type='text' name='captcha_code' value=''>

6、后台验证
Boolean isResponseCorrect =Boolean.FALSE;
        String captchaId = httpServletRequest.getSession().getId();
        String response = httpServletRequest.getParameter("captcha_code");
        try {
                isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,response);
        } catch (CaptchaServiceException e) {
   //TODO
        }
最简单的开发过程结束,试运行一下效果!

注:要实现自己的验证引擎可以继承ListImageCaptchaEngine实现抽象方法buildInitialFactories()。

----------------------------------------------------------------------------------------------------------------------------

TestHTTPAuthServer.java

import nl.captcha. Captcha . Builder ;
import nl.captcha.obscurity.text.producer. TextProducer ;

        private byte [] createCaptchaImage(String captcha) {
                Builder b = new nl.captcha.Captcha .Builder (200 ,50 );
                b.addText(new MyTextProducer (captcha));
                b.addNoise();
                b.addNoise();
                b.gimp();
                b.addBackground();


                nl.captcha.Captcha c = b.build();

                ByteArrayOutputStream n = new ByteArrayOutputStream ();
                try {
                        ImageIO .write(c.getImage(), "PNG" , n);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return n.toByteArray();
        }

        private class MyTextProducer implements TextProducer {

                private String txt;

                public MyTextProducer (String txt){
                        this .txt = txt;
                }

                public String getText() {
                        return txt;
                }

        }

 

分享到:
评论

相关推荐

    SimpleCaptcha验证码组件使用

    SimpleCaptcha是一款开源的Java验证码库,它提供了生成图像验证码的功能,支持自定义长度、颜色、字体等参数,使得验证码既具有较高的安全性,又保持了良好的用户体验。它的主要特点是代码简洁,易于集成到各类项目...

    kaptcha 验证码demo,附simplecaptcha

    Kaptcha是一个开源Java库,用于生成复杂的图像验证码,而SimpleCaptcha是另一种简洁的Java验证码实现。在这篇文章中,我们将深入探讨这两个工具及其在Java Web开发中的应用。 **Kaptcha** Kaptcha是由Google开发的...

    谷歌验证码使用工具——kaptcha-2.3.2

    【谷歌验证码使用工具——kaptcha-2.3.2】是一款基于Java的开源验证码生成库,主要用于网站的身份验证,防止自动化的机器人或者恶意攻击者进行非法操作。kaptcha这个名字是"CAPTCHA"(Completely Automated Public ...

    java开源包6

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包9

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包8

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包10

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    kaptcha验证码组件使用简介解析

    Kaptcha验证码组件是基于SimpleCaptcha的开源项目,提供了强大的验证码生成和验证功能。该组件的使用非常方便,只需添加jar包依赖和简单的配置就可以使用了。 一、添加jar包依赖 如果您使用Maven来管理jar包,可以...

    java开源包1

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包2

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包3

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包11

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包5

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包7

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包4

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开源包101

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    JLoja:库存控制和商店管理系统-开源

    通过整合这些开源组件,JLoja 实现了一个功能全面的库存控制和商店管理系统,不仅满足基本的库存跟踪和销售记录,还能提供报表分析、安全防护等高级功能。开源的特性使得开发者可以根据自己的需求对其进行定制和扩展...

    Java资源包01

    GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,...

    java开发常用jar包

    通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器 jxl-2.6.jar 通过java操作excel表格的工具类库 jta-1.1.jar Java事务API,为J2EE平台提供了分布式事务服务 ...

Global site tag (gtag.js) - Google Analytics