使用JCaptcha组件生成验证码

jopen 10年前

以下为项目中所用代码,文笔有限,直接上代码。

所需jar包:

20140106144536640.png

是否需要其他依赖包,不详

 

web.xml

</div> </div>
    <servlet>             <servlet-name>Jcaptcha</servlet-name>             <servlet-class>com.bkgd.cms.servlet.JcaptchaServlet</servlet-class>        </servlet>        <servlet-mapping>             <servlet-name>Jcaptcha</servlet-name>             <url-pattern>/captcha.svl</url-pattern>        </servlet-mapping>  

需要一个服务类 生成Image</strong></span>
    package com.bkgd.cms.servlet;                import java.awt.image.BufferedImage;        import java.io.IOException;                import javax.servlet.ServletException;        import javax.servlet.ServletOutputStream;        import javax.servlet.http.HttpServlet;        import javax.servlet.http.HttpServletRequest;        import javax.servlet.http.HttpServletResponse;        import org.apache.commons.io.output.ByteArrayOutputStream;        import org.apache.log4j.Logger;        import com.octo.captcha.service.CaptchaServiceException;        import com.sun.image.codec.jpeg.JPEGCodec;        import com.sun.image.codec.jpeg.JPEGImageEncoder;                @SuppressWarnings("serial")        public class JcaptchaServlet extends HttpServlet {            public static final String CAPTCHA_IMAGE_FORMAT = "jpeg";                    private static final Logger log = Logger.getLogger(JcaptchaServlet.class);                    @Override            public void init() throws ServletException {            }                    /**            * @step1 本方法使用Jcaptcha工具生成img图片,并输出到客户端            * @step2 将来在用户提交的action中插入下面语句进行验证码的校验:Boolean isResponseCorrect =            *        captchaService.validateResponseForID( captchaId, "");            **/            @Override            protected void doGet(HttpServletRequest request,                    HttpServletResponse response) throws ServletException, IOException {                byte[] captchaChallengeAsJpeg = null;                ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();                try {                    // 借助于HttpSession ID存储Captcha ID,开发者也可以借助于其他惟一值                    String captchaId = request.getSession().getId();                    // 获得GMailEngine使用的图片内容                    BufferedImage challenge = JCaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId, request.getLocale());                    // 输出JPEG格式                    JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);                    jpegEncoder.encode(challenge);                } catch (IllegalArgumentException e) {                    log.error(e);                    response.sendError(HttpServletResponse.SC_NOT_FOUND);                    return;                } catch (CaptchaServiceException e) {                    log.error(e);                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);                    return;                }                captchaChallengeAsJpeg = jpegOutputStream.toByteArray();                response.setHeader("Cache-Control", "no-store");                response.setHeader("Pragma", "no-cache");                response.setDateHeader("Expires", 0);                // 输出JPEG图片                response.setContentType("image/jpeg");                ServletOutputStream responseOutputStream = response.getOutputStream();                responseOutputStream.write(captchaChallengeAsJpeg);                responseOutputStream.flush();                responseOutputStream.close();            }        }  
</div> </div>
JCaptchaServiceSingleton</strong></span>
    package com.bkgd.cms.servlet;                import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;        import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;        import com.octo.captcha.service.image.ImageCaptchaService;                public class JCaptchaServiceSingleton {            private static ImageCaptchaService imageCaptchaService = new DefaultManageableImageCaptchaService(                    new FastHashMapCaptchaStore(), new GMailEngine(), 180, 100000,                    75000);                    public static ImageCaptchaService getInstance() {                return imageCaptchaService;            }        }  
</div> </div>
验证码样式的图片引擎GMailEngine</strong></span>
    package com.bkgd.cms.servlet;                import java.awt.Color;        import java.awt.Font;        import java.awt.image.ImageFilter;                import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;        import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;        import com.octo.captcha.component.image.color.RandomListColorGenerator;        import com.octo.captcha.component.image.deformation.ImageDeformation;        import com.octo.captcha.component.image.deformation.ImageDeformationByFilters;        import com.octo.captcha.component.image.fontgenerator.FontGenerator;        import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;        import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;        import com.octo.captcha.component.image.textpaster.TextPaster;        import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;        import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;        import com.octo.captcha.component.image.wordtoimage.WordToImage;        import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;        import com.octo.captcha.component.word.wordgenerator.WordGenerator;        import com.octo.captcha.engine.image.ListImageCaptchaEngine;        import com.octo.captcha.image.gimpy.GimpyFactory;                /**        * 仿照JCaptcha2.0编写GMail验证码样式的图片引擎.        */        public class GMailEngine extends ListImageCaptchaEngine {            @Override            protected void buildInitialFactories() {                int minWordLength = 4;                int maxWordLength = 4;                int fontSize = 26;                int imageWidth = 110;                int imageHeight = 50;                //在页面上将显示的内容                WordGenerator dictionnaryWords = new RandomWordGenerator("1234567890");                TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,                        maxWordLength, new RandomListColorGenerator(                                new Color[] { new Color(0, 0, 0) }),                        new TextDecorator[] {});                BackgroundGenerator background = new UniColorBackgroundGenerator(                        imageWidth, imageHeight, Color.white);                FontGenerator font = new RandomFontGenerator(fontSize, fontSize,                        new Font[] { new Font("nyala", Font.BOLD, fontSize),                                new Font("Bell MT", Font.PLAIN, fontSize),                                new Font("Credit valley", Font.BOLD, fontSize) });                        ImageDeformation postDef = new ImageDeformationByFilters(new ImageFilter[] {});                ImageDeformation backDef = new ImageDeformationByFilters(new ImageFilter[] {});                ImageDeformation textDef = new ImageDeformationByFilters(new ImageFilter[] {});                        WordToImage word2image = new DeformedComposedWordToImage(font,                        background, randomPaster, backDef, textDef, postDef);                addFactory(new GimpyFactory(dictionnaryWords, word2image));            }                }  
</div> </div>
前台JSP</strong></span>
    <input class="input" type="text" name="checkCode" id="checkCode" value=""/>        <img id="captcha" src="captcha.svl" onclick="this.src='captcha.svl?d='+new Date()*1"/>  
</div> </div>
后台Action验证</strong></span>
HttpServletRequest request = ServletActionContext.getRequest();    String sessID = request.getSession().getId();    Boolean isResponseCorrect = JCaptchaServiceSingleton.getInstance().validateResponseForID(sessID, checkCode);    if(isResponseCorrect){        return "true"    }else{        return "false"      }  
</div> </div>