安裝
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
- }
OK,大功告成了