使用 jcaptcha 产生图片校验码

第一步:下载 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;
}
}

}
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值