使用 jcaptcha 产生图片校验码
具体使用的例子: www.tongriben.com
第一步:下载 jcaptcha-all-1.0-RC2.0.1.jar
第二步:代码实现
CaptchaServiceSingleton.java
package com.yh.web.jcaptcha;import java.awt.Color;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.Iterator;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.log4j.Logger;import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;import com.octo.captcha.component.image.fontgenerator.FontGenerator;import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;import com.octo.captcha.component.image.textpaster.RandomTextPaster;import com.octo.captcha.component.image.textpaster.SimpleTextPaster;import com.octo.captcha.component.image.textpaster.TextPaster;import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;import com.octo.captcha.component.image.wordtoimage.WordToImage;import com.octo.captcha.component.wordgenerator.RandomWordGenerator;import com.octo.captcha.component.wordgenerator.WordGenerator;import com.octo.captcha.engine.image.ListImageCaptchaEngine;import com.octo.captcha.image.ImageCaptcha;import com.octo.captcha.image.ImageCaptchaFactory;import com.octo.captcha.image.gimpy.GimpyFactory;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class CaptchaServiceSingleton extends ListImageCaptchaEngine {private static Logger log = Logger.getLogger(CaptchaServiceSingleton.class);private static final Integer MIN_WORD_LENGTH = new Integer(4);private static final Integer MAX_WORD_LENGTH = new Integer(6);private static final Integer IMAGE_WIDTH = new Integer(70);private static final Integer IMAGE_HEIGHT = new Integer(20);private static final Integer MIN_FONT_SIZE = new Integer(12);private static final Integer MAX_FONT_SIZE = new Integer(14);private static final String NUMERIC_CHARS = "23456789";// No numeric 0private static final String UPPER_ASCII_CHARS = "ABCDEFGHJKLMNPQRSTXYZ";// No// upper// O I// we dont use the lower characters because it cause dificult in some case,// so that// we must always UPPERCASE the input from user (currently in// OnlineUserImpl)private static final String LOWER_ASCII_CHARS = "abcdefghjkmnpqrstxyz";// No// lower// o i/** * Singleton instance of this class */private static CaptchaServiceSingleton instance = new CaptchaServiceSingleton();private ArrayList textPasterList;private ArrayList backgroundGeneratorList;private ArrayList fontGeneratorList;ImageCaptcha imageCaptcha = null;/** * Private constructor to prevent instantiation */private CaptchaServiceSingleton() {}public static CaptchaServiceSingleton getInstance() {return instance;}protected void buildInitialFactories() {try {textPasterList = new ArrayList();backgroundGeneratorList = new ArrayList();fontGeneratorList = new ArrayList();textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.black));textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.black));textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.black));textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.black));textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.blue));textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH, Color.blue));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.orange, Color.white));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.white, Color.green));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.gray, Color.white));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.white, Color.orange));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.green, Color.white));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.yellow, Color.white));backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.white, Color.magenta));// fontGeneratorList.add(new// TwistedAndShearedRandomFontGenerator(MIN_FONT_SIZE,// MAX_FONT_SIZE));// fontGeneratorList.add(new// TwistedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));// link// character too muchfontGeneratorList.add(new RandomFontGenerator(MIN_FONT_SIZE,MAX_FONT_SIZE));// to easy to read// fontGeneratorList.add(new// DeformedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));// to// small font// no char upper O, char lower o and numerric 0 because user cannot// answerWordGenerator words = new RandomWordGenerator(NUMERIC_CHARS+ UPPER_ASCII_CHARS);for (Iterator fontIter = fontGeneratorList.iterator(); fontIter.hasNext();) {FontGenerator font = (FontGenerator) fontIter.next();for (Iterator backIter = backgroundGeneratorList.iterator(); backIter.hasNext();) {BackgroundGenerator back = (BackgroundGenerator) backIter.next();for (Iterator textIter = textPasterList.iterator(); textIter.hasNext();) {TextPaster parser = (TextPaster) textIter.next();WordToImage word2image = new ComposedWordToImage(font,back, parser);ImageCaptchaFactory factory = new GimpyFactory(words,word2image);addFactory(factory);}}}} catch (Exception ex) {log.error("产生校验码初始化异常 == " + ex);// throw ex;}}/** * Write the captcha image of current user to the servlet response * * @param request * HttpServletRequest * @param response * HttpServletResponse * @throws IOException */public void writeCaptchaImage(HttpServletRequest request,HttpServletResponse response) throws IOException {imageCaptcha = getNextImageCaptcha();HttpSession session = request.getSession();session.setAttribute("imageCaptcha", imageCaptcha);BufferedImage image = (BufferedImage) imageCaptcha.getChallenge();OutputStream outputStream = null;try {outputStream = response.getOutputStream();// render the captcha challenge as a JPEG image in the responseresponse.setHeader("Cache-Control", "no-store");response.setHeader("Pragma", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/jpeg");JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);encoder.encode(image);outputStream.flush();outputStream.close();outputStream = null;// no close twice} catch (IOException ex) {log.error("产生图片异常 == " + ex);throw ex;} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException ex) {}}imageCaptcha.disposeChallenge();}}public boolean validateCaptchaResponse(String validateCode,HttpSession session) {boolean flag = true;try {imageCaptcha = (ImageCaptcha) session.getAttribute("imageCaptcha");if (imageCaptcha == null) {// log.info("validateCaptchaResponse returned false due to// imageCaptcha is null");flag = false;}//validateCode = validateCode.toLowerCase();// use upper case forvalidateCode = validateCode.toUpperCase();// use upper case for// easier usageflag = (imageCaptcha.validateResponse(validateCode)).booleanValue();session.removeAttribute("imageCaptcha");return flag;} catch (Exception ex) {ex.printStackTrace();log.error("校验码校验异常 == " + ex);return false;}}} package com.yh.web.servlet;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.yh.web.jcaptcha.CaptchaServiceSingleton;import com.octo.captcha.service.CaptchaServiceException;public class ImageCaptchaServlet extends HttpServlet {private static final long serialVersionUID = -5382766069139170499L;public void init(ServletConfig servletConfig) throws ServletException {super.init(servletConfig);}protected void doGet(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws ServletException,IOException {System.out.println("---------- ImageCaptchaServlet pass here -------------");try {CaptchaServiceSingleton.getInstance().writeCaptchaImage(httpServletRequest, httpServletResponse);} catch (IllegalArgumentException e) {httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);return;} catch (CaptchaServiceException e) {httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);return;}}} HttpSession session = request.getSession();boolean isResponseCorrect = false;// retrieve the responseString validateCode = checkCode.trim();System.out.println("checkCode == "+ checkCode);try {isResponseCorrect = CaptchaServiceSingleton.getInstance().validateCaptchaResponse(validateCode, session);return isResponseCorrect;} catch (Exception e) {// should not happen, may be thrown if the id is not validreturn false;} 1 楼 liusu 2011-09-26 checkCode在哪里啊???