用开源组件jcaptcha做jsp彩色验证码

来源:互联网 发布:javascript图书 知乎 编辑:程序博客网 时间:2024/04/30 23:00

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
              }