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
具體請參考
官方說明編寫一個產生圖片的servletimport?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,大功告成了.