在做opencms的表单时,使用到了jcaptcha来做验证码.简单看了一下,觉得还不错,收藏了.今天又进步了一点点,嘿嘿:)
用开源组件jcaptcha做jsp彩色验证码
key words: jsp验证码 jcaptcha
原文参考 这里
安装
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里是用户填写的确认验证码
后台逻辑验证
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
}
OK,大功告成了.