JCaptcha 是一个用来生成验证码的开源Java类库
CaptchaServiceSingleton类(单态类)
package com.dongbin.testy; import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore; import com.octo.captcha.service.image.DefaultManageableImageCaptchaService; import com.octo.captcha.service.image.ImageCaptchaService; public class CaptchaServiceSingleton { private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService( new FastHashMapCaptchaStore(), new ImageCaptchaEngineExtend(), 180, 100000, 75000); public static ImageCaptchaService getInstance(){ return instance; } }
ImageCaptchaEngineExtend类 (扩展验证码格式)
package com.dongbin.testy; import java.awt.Color; import java.awt.Font; import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator; import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator; import com.octo.captcha.component.image.color.RandomRangeColorGenerator; 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.BaffleTextDecorator; import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator; import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator; import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage; 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; public class ImageCaptchaEngineExtend extends ListImageCaptchaEngine{ @Override protected void buildInitialFactories() { int num = 5;//默认为5个 //设置内容 WordGenerator wgen = new RandomWordGenerator("abcdefghijklmnopqrstuvwxyz123456789"); //设置颜色 RandomRangeColorGenerator cgen = new RandomRangeColorGenerator( new int[] { 100, 255 }, new int[] { 100, 255 }, new int[] { 100, 255 }); RandomRangeColorGenerator cgen1 = new RandomRangeColorGenerator( new int[] { 0, 100 }, new int[] { 0, 100 }, new int[] { 0, 100 }); //设置背景色 BackgroundGenerator backgroundGenerator = new UniColorBackgroundGenerator(new Integer(80), new Integer(37),Color.WHITE); //设置字体 Font[] fontsList = new Font[] { new Font("Arial", 0, 12), new Font("Tahoma", 0, 12), new Font("Verdana", 0, 12), }; FontGenerator fontGenerator = new RandomFontGenerator(new Integer(26), new Integer(26), fontsList); // BaffleTextDecorator baffleTextDecorator = new BaffleTextDecorator(1,cgen1);//气泡干扰 LineTextDecorator lineTextDecorator = new LineTextDecorator(0,cgen1);//曲线干扰 TextDecorator[] textDecorators = new TextDecorator[1]; // textDecorators[0] = baffleTextDecorator; textDecorators[0] = lineTextDecorator; TextPaster textPaster = new DecoratedRandomTextPaster(new Integer(num),new Integer(num), cgen, true,textDecorators); // TextPaster textPaster = new DecoratedRandomTextPaster(new Integer(num),new Integer(num), cgen, true, // new TextDecorator[] { new BaffleTextDecorator(new Integer(1), Color.WHITE) }); WordToImage wordToImage = new ComposedWordToImage(fontGenerator,backgroundGenerator, textPaster); this.addFactory(new GimpyFactory(wgen, wordToImage)); } }
ImageCaptchaServlet类
package com.dongbin.testy; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.octo.captcha.service.CaptchaServiceException; public class ImageCaptchaServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); ServletOutputStream out = response.getOutputStream(); try { String captchaId = request.getSession(true).getId(); BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(captchaId, request.getLocale()); ImageIO.write(challenge, "jpg", out); out.flush(); } catch (CaptchaServiceException e) { } finally { out.close(); } } }
页面index.jsp
<form action="testjcaptcha"> <label for="j_captcha_response">请填写验证码:</label><br/> <img src="jcaptcha"alt="点击刷新" onClick="this.src='jcaptcha?t=' + Math.random();" align="absmiddle" style="vertical-align: bottom;margin: 10px 0 0 10px;cursor: pointer;"> <input type="text" name="j_captcha_response" value=""> <input type="submit" value="提交"> </form>
效果图
验证VerifyCodeServlet类
package com.dongbin.testy; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.octo.captcha.service.CaptchaServiceException; public class VerifyCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean b = false; String codeValue =request.getParameter("j_captcha_response"); try { b = CaptchaServiceSingleton.getInstance().validateResponseForID(request.getSession().getId(), codeValue.toLowerCase()); } catch (CaptchaServiceException e) { e.printStackTrace(); } response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>验证结果:</TITLE></HEAD>"); out.println(" <BODY>"); if(b == Boolean.TRUE){ out.print("验证通过!"); }else { out.print("验证失败!"); } out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }