jcaptcha做jsp彩色验证码

来源:互联网 发布:知规矩守规矩班会 ppt 编辑:程序博客网 时间:2024/05/01 01:45
在做opencms的表单时,使用到了jcaptcha来做验证码.简单看了一下,觉得还不错,收藏了.今天又进步了一点点,嘿嘿:)

用开源组件jcaptcha做jsp彩色验证码
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,大功告成了.
原创粉丝点击