使用 jcaptcha 产生图片校验码
具体使用的例子: www.tongriben.com
第一步:下载 jcaptcha-all-1.0-RC2.0.1.jar
第二步:代码实现
CaptchaServiceSingleton.java
ImageCaptchaServlet.java
jsp页面增加校验码内容:
<tr><td>
校验码:<input type="text" size="8" name="checkCode" id="checkCode" class="normal_input"/><img src="/jcaptcha" id="checkCodeImg" οnclick="this.src='/jcaptcha?now=' + new Date().getTime()" alt="看不清,点击换一张" >请输入校验码,大小写不区分<br> 如看不清,请点击图片换一张
</td></tr>
判断校验码是否正确的java代码:
第一步:下载 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 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;
- }
- }
- }
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;
- }
- }
- }
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" οnclick="this.src='/jcaptcha?now=' + new Date().getTime()" alt="看不清,点击换一张" >请输入校验码,大小写不区分<br> 如看不清,请点击图片换一张
</td></tr>
判断校验码是否正确的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;
- }