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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值