第一步:下载 jcaptcha-all-1.0-RC2.0.1.jar
第二步:代码实现
CaptchaServiceSingleton.java
Java代码
第二步:代码实现
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 0
private 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 much
fontGeneratorList.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
// answer
WordGenerator 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 response
response.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 for
validateCode = validateCode.toUpperCase();// use upper case for
// easier usage
flag = (imageCaptcha.validateResponse(validateCode)).booleanValue();
session.removeAttribute("imageCaptcha");
return flag;
} catch (Exception ex) {
ex.printStackTrace();
log.error("校验码校验异常 == " + ex);
return false;
}
}
}
ImageCaptchaServlet.java
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;
}
}
}
jsp页面增加校验码内容:
<tr><td>
校验码:<input type="text" size="8" name="checkCode" id="checkCode" class="normal_input"/><img src="/jcaptcha" id="checkCodeImg" onclick="this.src='/jcaptcha?now=' + new Date().getTime()" alt="看不清,点击换一张" >请输入校验码,大小写不区分<br> 如看不清,请点击图片换一张
</td></tr>
判断校验码是否正确的java代码:
Java代码
HttpSession session = request.getSession();
boolean isResponseCorrect = false;
// retrieve the response
String 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 valid
return false;