captche验证码

JCaptcha 是一个用来生成验证码的开源Java类库

CaptchaServiceSingleton类(单态类)

package com.dongbin.testy;

import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class CaptchaServiceSingleton {

    private static ImageCaptchaService instance = 
            new DefaultManageableImageCaptchaService( new FastHashMapCaptchaStore(), new ImageCaptchaEngineExtend(),  
                    180, 100000, 75000);
    
    public static ImageCaptchaService getInstance(){
        return instance;
    }
}
ImageCaptchaEngineExtend类 (扩展验证码格式)

package com.dongbin.testy;

import java.awt.Color;
import java.awt.Font;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomRangeColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;


public class ImageCaptchaEngineExtend extends ListImageCaptchaEngine{

    @Override
    protected void buildInitialFactories() {
        int num = 5;//默认为5个
        
        //设置内容
        WordGenerator wgen =  new RandomWordGenerator("abcdefghijklmnopqrstuvwxyz123456789");
        //设置颜色
        RandomRangeColorGenerator cgen = new RandomRangeColorGenerator(
        new int[] { 100, 255 }, new int[] { 100, 255 },
        new int[] { 100, 255 });
        
        RandomRangeColorGenerator cgen1 = new RandomRangeColorGenerator(
                new int[] { 0, 100 }, new int[] { 0, 100 },
                new int[] { 0, 100 });
        
        
        //设置背景色
        BackgroundGenerator backgroundGenerator = new UniColorBackgroundGenerator(new Integer(80), new Integer(37),Color.WHITE);
        //设置字体
        Font[] fontsList = new Font[] { new Font("Arial", 0, 12),
                new Font("Tahoma", 0, 12), new Font("Verdana", 0, 12), };
        FontGenerator fontGenerator = new RandomFontGenerator(new Integer(26),
                new Integer(26), fontsList);
//        BaffleTextDecorator baffleTextDecorator = new BaffleTextDecorator(1,cgen1);//气泡干扰 
        LineTextDecorator lineTextDecorator = new LineTextDecorator(0,cgen1);//曲线干扰 
        TextDecorator[] textDecorators = new TextDecorator[1];
//        textDecorators[0] = baffleTextDecorator;  
        textDecorators[0] = lineTextDecorator; 
        TextPaster textPaster = new DecoratedRandomTextPaster(new Integer(num),new Integer(num), cgen, true,textDecorators);
//        TextPaster textPaster = new DecoratedRandomTextPaster(new Integer(num),new Integer(num), cgen, true,
//                new TextDecorator[] { new BaffleTextDecorator(new Integer(1), Color.WHITE) });
        WordToImage wordToImage = new ComposedWordToImage(fontGenerator,backgroundGenerator, textPaster);
        this.addFactory(new GimpyFactory(wgen, wordToImage));
        
    }

}

ImageCaptchaServlet类

package com.dongbin.testy;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
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 com.octo.captcha.service.CaptchaServiceException;

public class ImageCaptchaServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void init(ServletConfig servletConfig) throws ServletException {  
          
            super.init(servletConfig);  
      
     }  
      
      
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
          
        response.setHeader("Cache-Control", "no-store");  
        response.setHeader("Pragma", "no-cache");  
        response.setDateHeader("Expires", 0);  
        response.setContentType("image/jpeg");  
        ServletOutputStream out = response.getOutputStream();  
        try {  
            String captchaId = request.getSession(true).getId();  
            BufferedImage challenge = (BufferedImage)  CaptchaServiceSingleton.getInstance().getChallengeForID(captchaId, request.getLocale());  
            ImageIO.write(challenge, "jpg", out);  
            out.flush();  
        } catch (CaptchaServiceException e) {  
        } finally {  
            out.close();  
        }  
    }
}

页面index.jsp

 <form action="testjcaptcha">
        <label for="j_captcha_response">请填写验证码:</label><br/>
        <img src="jcaptcha"alt="点击刷新" onClick="this.src='jcaptcha?t=' + Math.random();" align="absmiddle" style="vertical-align: bottom;margin: 10px 0 0 10px;cursor: pointer;">
        <input type="text" name="j_captcha_response" value="">
        <input type="submit" value="提交">
    </form>

效果图

验证VerifyCodeServlet类

package com.dongbin.testy;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.octo.captcha.service.CaptchaServiceException;


public class VerifyCodeServlet extends HttpServlet {

    
    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.doGet(req, resp);
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        
        boolean b = false;  
        
        String codeValue =request.getParameter("j_captcha_response");        
        
       
        try {
            b = CaptchaServiceSingleton.getInstance().validateResponseForID(request.getSession().getId(), codeValue.toLowerCase());
        } catch (CaptchaServiceException e) {
            e.printStackTrace();
        }
        
  
        response.setContentType("text/html;charset=utf-8");  
        PrintWriter out = response.getWriter();  
        out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");  
        out.println("<HTML>");  
        out.println("  <HEAD><TITLE>验证结果:</TITLE></HEAD>");  
        out.println("  <BODY>");  
        if(b == Boolean.TRUE){  
            out.print("验证通过!");  
        }else {  
            out.print("验证失败!");  
        }  
        out.println("  </BODY>");  
        out.println("</HTML>");  
        out.flush();  
        out.close();  
  
    }

}


原文地址:https://www.cnblogs.com/b-dong/p/5792882.html