本文章摘编、转载需要注明来源 http://write.blog.csdn.net/postedit/8575471
对于验证码的各个插件大家都应该熟悉不少了,但是我比较喜欢用jcaptcha这个插件,下面我演示自己的扩展使用
我使用的是DefaultManageableImageCaptchaService实现类根据源码的实现类改编过来的,至于其他的实现类有兴趣的可以自己去看下文档
然后就开始写我们的扩展类ImageCaptchaEngineExtend,该类要继承ListImageCaptchaEngine
/** * 自定义验证码内容样式 * * @author shadow * @email 124010356@qq.com */ public class ImageCaptchaEngineExtend extends ListImageCaptchaEngine { protected void buildInitialFactories() { // build filters WaterFilter water = new WaterFilter(); water.setAmplitude(3d); water.setAntialias(true); water.setPhase(20d); water.setWavelength(70d); ImageDeformation backDef = new ImageDeformationByFilters( new ImageFilter[] {}); ImageDeformation textDef = new ImageDeformationByFilters( new ImageFilter[] {}); ImageDeformation postDef = new ImageDeformationByFilters( new ImageFilter[] { water }); // word generator WordGenerator dictionnaryWords = new RandomWordGenerator( "abcdefhjkmnprstuvwxyz23456789"); // wordtoimage components RandomRangeColorGenerator colors = new RandomRangeColorGenerator( new int[] { 0, 150 }, new int[] { 0, 150 }, new int[] { 0, 150 }); // Arial,Tahoma,Verdana,Helvetica,宋体,黑体,幼圆 Font[] fonts = new Font[] { new Font("Arial", 0, 15), new Font("Tahoma", 0, 15), new Font("Verdana", 0, 15), new Font("Helvetica", 0, 15), new Font("宋体", 0, 15), new Font("黑体", 0, 15), new Font("幼圆", 0, 15) }; // 设置字符以及干扰线 RandomRangeColorGenerator lineColors = new RandomRangeColorGenerator( new int[] { 150, 255 }, new int[] { 150, 255 }, new int[] { 150, 255 }); TextPaster randomPaster = new DecoratedRandomTextPaster(new Integer(4), new Integer(4), colors, true, new TextDecorator[] { new LineTextDecorator(new Integer(1), lineColors) }); BackgroundGenerator back = new UniColorBackgroundGenerator(new Integer( 140), new Integer(45), Color.white); FontGenerator shearedFont = new RandomFontGenerator(new Integer(30), new Integer(0), fonts); // word2image 1 WordToImage word2image; word2image = new DeformedComposedWordToImage(shearedFont, back, randomPaster, backDef, textDef, postDef); this.addFactory(new GimpyFactory(dictionnaryWords, word2image)); } }
然后写个单例调用我们的实现类
/** * Jcaptcha单例模式 * * @author shadow * @email 124010356@qq.com * @create 2012.04.28 */ public class CaptchaServiceSingleton { // 不允许构造实例 private CaptchaServiceSingleton() { } private static ImageCaptchaService instance = null; /** * SimpleListSoundCaptchaEngine //还可以用声音 SpellerSoundCaptchaEngine * SpellerSoundCaptchaEngine DefaultGimpyEngineCaptcha * BaffleListGimpyEngineCaptcha BasicListGimpyEngineCaptcha * DeformedBaffleListGimpyEngineCaptcha DoubleRandomListGimpyEngineCaptcha * SimpleListImageCaptchaEngineCaptcha SimpleFishEyeEngineCaptcha */ // 传入样式类 static { instance = new DefaultManageableImageCaptchaService( new FastHashMapCaptchaStore(), new ImageCaptchaEngineExtend(), 180, 100000, 75000); } public static ImageCaptchaService getInstance() { return instance; } }
再来个servlet类
@SuppressWarnings("serial") public class ImageCaptchaServlet extends HttpServlet { public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { byte[] captchaChallengeAsJpeg = null; // the output stream to render the captcha image as jpeg into ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { // get the session id that will identify the generated captcha. // the same id must be used to validate the response, the session id // is a good candidate! String captchaId = httpServletRequest.getSession().getId(); // call the ImageCaptchaService getChallenge method BufferedImage challenge = CaptchaServiceSingleton.getInstance() .getImageChallengeForID(captchaId, httpServletRequest.getLocale()); // a jpeg encoder 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(); // flush it in the response 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(); } }
接着我们来配置web.xml
<!-- jcaptcha filter --> <servlet> <servlet-name>jcaptcha</servlet-name> <servlet-class> com.shadow.extras.jcaptcha.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>