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


原文参考 这里

安装

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

你可能感兴趣的:(用开源组件jcaptcha做jsp彩色验证码)