安装
Add jcaptcha-all.jar (provided in bin-distribution) and ehcache.jar (not provided see ehcache site) to your application class path, ie in you WEB-INF/lib folder.
实例一个jcaptcha服务,注意,必须是单例模式的
- import com.octo.captcha.service.image.ImageCaptchaService;
- import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
- public class CaptchaServiceSingleton {
- private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();
- public static ImageCaptchaService getInstance(){
- return instance;
- }
- }
注:以上是默认的一个实现,下面是其他更多的实现
SimpleListSoundCaptchaEngine //还可以用声音,真爽哦
SpellerSoundCaptchaEngine
SpellerSoundCaptchaEngine
DefaultGimpyEngineCaptcha
BaffleListGimpyEngineCaptcha
BasicListGimpyEngineCaptcha
DeformedBaffleListGimpyEngineCaptcha
DoubleRandomListGimpyEngineCaptcha
SimpleListImageCaptchaEngineCaptcha
SimpleFishEyeEngineCaptcha
具体请参考官方说明
编写一个产生图片的servlet
- import com.octo.captcha.service.CaptchaServiceException;
- import com.sun.image.codec.jpeg.JPEGCodec;
- import com.sun.image.codec.jpeg.JPEGImageEncoder;
- 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 java.awt.image.BufferedImage;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- public class ImageCaptchaServlet extends HttpServlet {
- public void init(ServletConfig servletConfig) throws ServletException {
- super.init(servletConfig);
- }
- protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- byte[] captchaChallengeAsJpeg = null;
- // the output stream to render the captcha image as jpeg into
- ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
- try {
- // get the session id that will identify the generated captcha.
- //the same id must be used to validate the response, the session id is a good candidate!
- String captchaId = httpServletRequest.getSession().getId();
- // call the ImageCaptchaService getChallenge method
- BufferedImage challenge =
- CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
- httpServletRequest.getLocale());
- // a jpeg encoder
- JPEGImageEncoder jpegEncoder =
- JPEGCodec.createJPEGEncoder(jpegOutputStream);
- jpegEncoder.encode(challenge);
- } catch (IllegalArgumentException e) {
- httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- } catch (CaptchaServiceException e) {
- httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
- captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
- // flush it in the response
- httpServletResponse.setHeader("Cache-Control", "no-store");
- httpServletResponse.setHeader("Pragma", "no-cache");
- httpServletResponse.setDateHeader("Expires", 0);
- httpServletResponse.setContentType("image/jpeg");
- ServletOutputStream responseOutputStream =
- httpServletResponse.getOutputStream();
- responseOutputStream.write(captchaChallengeAsJpeg);
- responseOutputStream.flush();
- responseOutputStream.close();
- }
- }
为servlet修改web.xml配置文件
- <servlet>
- <servlet-name>jcaptcha</servlet-name>
- <servlet-class>ImageCaptchaServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>jcaptcha</servlet-name>
- <url-pattern>/jcaptcha</url-pattern>
- </servlet-mapping>
编写你的客户端的展示
- <img src="jcaptcha">
- <input type='text' name='j_captcha_response' value=''>
上面的src="jcaptcha" 就是调用了上面的servlet,text里是用户填写的确认验证码
或者把图片连接那句换成下句
- <img src="/jcaptcha" id="checkCodeImg" onclick="this.src='/jcaptcha?now=' + new Date().getTime()" alt="看不清,点击换一张" >请输入校验码,大小写不区分<br> 如看不清,请点击图片换一张
后台逻辑验证
- Boolean isResponseCorrect =Boolean.FALSE;
- //remenber that we need an id to validate!
- String captchaId = httpServletRequest.getSession().getId();
- //retrieve the response
- String response = httpServletRequest.getParameter("j_captcha_response");
- // Call the Service method
- try {
- isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
- response);
- } catch (CaptchaServiceException e) {
- //should not happen, may be thrown if the id is not valid
- }