| 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,大功告成了.

Alex 2006-06-11 13:11
|