首页 > 编程语言 >java验证码组件Jcaptcha

java验证码组件Jcaptcha

时间:2022-12-18 20:00:35浏览次数:59  
标签:java octo Jcaptcha image 验证码 captcha import new com


Jcaptcha验证码生成组件用法

1.创建项目JcaptchaDemo

2.引入相关.jar文件

jcaptcha-1.0-all.jar;

commons-logging-1.0.4.jar;

commons-collections-2.1.1.jar

3.创建GMailEngine,仿照JCaptcha2.0编写GMail验证码样式的图片引擎.,具体的代码如下:

    设置生成验证的样式就是在这里设置。


package com.zsw.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.image.ImageFilter;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomListColorGenerator;
import com.octo.captcha.component.image.deformation.ImageDeformation;
import com.octo.captcha.component.image.deformation.ImageDeformationByFilters;
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.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.FileDictionary;
import com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
/**
 * 仿照JCaptcha2.0编写GMail验证码样式的图片引擎.  
 * @author Administrator
 */
public  class GMailEngine  extends ListImageCaptchaEngine  {
 @Override
  protected  void buildInitialFactories() {
  
    int minWordLength = 4;
    int maxWordLength = 5;
    int fontSize = 24;
    int imageWidth = 100;
    int imageHeight = 40;
           
    //word generator
   WordGenerator dictionnaryWords =  new ComposeDictionaryWordGenerator( new FileDictionary( "toddlist"));
           
    //word2image components 
   TextPaster randomPaster =  new DecoratedRandomTextPaster(
           minWordLength, 
           maxWordLength,
            new RandomListColorGenerator( new Color[] { 
              new Color(23, 170, 27), 
              new Color(220, 34, 11),   
              new Color(23, 67, 172) 
           }), 
                             new TextDecorator[] {}
         );
           
   BackgroundGenerator background =  new UniColorBackgroundGenerator(imageWidth, imageHeight, Color.white);
   FontGenerator font =  new RandomFontGenerator(
        fontSize, 
        fontSize, 
         new Font[] {
                     new Font( "nyala", Font.BOLD, fontSize), 
                     new Font( "Bell MT", Font.PLAIN, fontSize),   
                     new Font( "Credit valley", Font.BOLD, fontSize) 
                   });
   ImageDeformation postDef =  new ImageDeformationByFilters( new ImageFilter[] {});
   ImageDeformation backDef =  new ImageDeformationByFilters( new ImageFilter[] {});
   ImageDeformation textDef =  new ImageDeformationByFilters( new ImageFilter[] {}); 
   WordToImage word2image =  new DeformedComposedWordToImage(font, background, randomPaster, backDef, textDef,postDef);   
   addFactory( new GimpyFactory(dictionnaryWords, word2image));
 }
}


4.在这里创建一个单例类:


package com.zsw.servlet;
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 GMailEngine(), 180, 100000,75000);
  public  static ImageCaptchaService getInstance() {
   return instance;
 }
}


 

5.创建ImageCaptchaServlet.java,它是一个Servlet

图片src,制定这个Servlet在Web.xml中配置的名称,获取验证码图片。具体的内容如下:


package com.zsw.servlet;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
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;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public  class ImageCaptchaServlet  extends HttpServlet {
 
  private  static  final  long serialVersionUID = 1L;
     public ImageCaptchaServlet() {
    }
  protected  void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
  
   byte[] captchaChallengeAsJpeg = null;
  ByteArrayOutputStream jpegOutputStream =  new ByteArrayOutputStream();
  
   try {
     String captchaId = request.getSession().getId();   
    BufferedImage challenge = CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,request.getLocale());
   JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
   jpegEncoder.encode(challenge);
  }  catch (IllegalArgumentException e) {
   response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return;
  }  catch (CaptchaServiceException e) {
   response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    return;
  }
  captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
   // flush it in the response
  response.setHeader( "Cache-Control",  "no-store");
  response.setHeader( "Pragma",  "no-cache");
  response.setDateHeader( "Expires", 0);
  response.setContentType( "image/jpeg");
  ServletOutputStream responseOutputStream = response.getOutputStream();
  responseOutputStream.write(captchaChallengeAsJpeg);
  
  responseOutputStream.flush();
  responseOutputStream.close();
 }
  protected  void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
  
 }
}


 

6.创建index.jsp以及sample.jsp

index.jsp


%@ page language= "java"  contentType= "text/html; charset=UTF-8"  pageEncoding= "UTF-8" %>
< !DOCTYPE html "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd" >
< html>
< head>
< meta "Content-Type"  content= "text/html; charset=UTF-8" >
< title>Insert title here< /title>
< /head>
< body>
< form "sample.jsp" >
 < table style= "width:300px; height:30px;"  cellpadding= "1"  cellspacing= "1"  border= "1" >
  < tr>
   < td "right" >
    < input 'text'  name= 'j_captcha_response'  value= '' >
   < /td>
   < td "left" >
    < img "ImageCaptchaServlet" >
   < /td>
  < /tr>
 < /table>
< /form>
< /body>
< /html>


sample.jsp:处理检验验证码


%@ page language= "java"  contentType= "text/html; charset=ISO-8859-1"     pageEncoding= "UTF-8" %>
< %@page import= "com.octo.captcha.service.CaptchaServiceException" %>
< %@page import= "com.zsw.servlet.CaptchaServiceSingleton" %>
< %
Boolean isResponseCorrect = Boolean.FALSE;
 String captchaId = request.getSession().getId();
 String "j_captcha_response" );
 
 try {
  isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId, responsestr);
  if(isResponseCorrect){
  }else{
   out.print( "It's worng......" );
  }
 } catch (CaptchaServiceException e) {
 }
%>


 

7.启动服务,运行程序效果如下:

 

8, 对设置验证样式的引擎类,进行重构,及支持验证码有背景图片

8.1 创建com.zsw.captcha包,将相关背景图片放入该包中;

8.2 创建JCaptchaEngine.java,具体内容如下:


package com.zsw.common;
import java.awt.Color;
import java.awt.Font;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomListColorGenerator;
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.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 JCaptchaEngine  extends ListImageCaptchaEngine {
  public  static  final  String IMAGE_CAPTCHA_KEY =  "imageCaptcha"; // ImageCaptcha对象存放在Session中的key
  public  static  final  String CAPTCHA_INPUT_NAME =  "j_captcha"; // 验证码输入表单名称
  public  static  final  String CAPTCHA_IMAGE_URL =  "/captcha.jpg"; // 验证码图片URL
  private  static  final Integer MIN_WORD_LENGTH = 4; // 验证码最小长度
  private  static  final Integer MAX_WORD_LENGTH = 4; // 验证码最大长度
  private  static  final Integer IMAGE_HEIGHT = 28; // 验证码图片高度
  private  static  final Integer IMAGE_WIDTH = 80; // 验证码图片宽度
  private  static  final Integer MIN_FONT_SIZE = 16; // 验证码最小字体
  private  static  final Integer MAX_FONT_SIZE = 16; // 验证码最大字体
  private  static  final  String RANDOM_WORD =  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 随机字符
private static final String IMAGE_PATH = "./com/zsw/captcha/";// 随机背景图片路径
 
  // 验证码随机字体
  private  static  final Font[] RANDOM_FONT =  new Font[] { 
    new Font( "nyala", Font.BOLD, MIN_FONT_SIZE), 
    new Font( "Arial", Font.BOLD, MIN_FONT_SIZE),
    new Font( "Bell MT", Font.BOLD, MIN_FONT_SIZE), 
    new Font( "Credit valley", Font.BOLD, MIN_FONT_SIZE),
    new Font( "Impact", Font.BOLD, MIN_FONT_SIZE) 
 };
  // 验证码随机颜色
  private  static  final Color[] RANDOM_COLOR =  new Color[] { 
    new Color(255, 255, 255), 
    new Color(255, 220, 220), 
    new Color(220, 255, 255), 
    new Color(220, 220, 255),
    new Color(255, 255, 220), 
    new Color(220, 255, 220) 
 };
  // 生成验证码
 @Override
  protected  void buildInitialFactories() {
  
  RandomListColorGenerator randomListColorGenerator =  new RandomListColorGenerator(RANDOM_COLOR); // 验证码随机颜色
  BackgroundGenerator backgroundGenerator =  new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PATH);  //验证码背景图片
  WordGenerator wordGenerator =  new RandomWordGenerator(RANDOM_WORD);
  FontGenerator fontGenerator =  new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, RANDOM_FONT); // 验证码随机字体
  TextDecorator[] textDecorator =  new TextDecorator[] {};
  TextPaster textPaster =  new DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);
  WordToImage wordToImage =  new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
  addFactory( new GimpyFactory(wordGenerator, wordToImage));
 }
}


8.3 修改第4步中的单例类,具体内容如下:


package com.zsw.servlet;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.zsw.common.JCaptchaEngine;
public  class CaptchaServiceSingleton {
  private  static ImageCaptchaService instance =  new DefaultManageableImageCaptchaService( new FastHashMapCaptchaStore(),  new180, 100000,75000);
  public  static ImageCaptchaService getInstance() {
   return instance;
 }
}


8.4 运行启动,效果图如下:

 

 

1.参考相关文章

​http://www.iteye.com/topic/567144​

 

标签:java,octo,Jcaptcha,image,验证码,captcha,import,new,com
From: https://blog.51cto.com/u_15739274/5951098

相关文章

  • Java基础
    初始Java什么是程序:完成某一件事情的过程,完成事情的集合Javaee:企业版javase:标准版Javame:移动端版本Java运行的三步骤1.编写程序2.编译程序3.运行程序用记事本......
  • 【源码】java 脚手架 快速开发平台 项目 推荐 节约开发成本
     JEECG开源社区 / jeecg-boot​​jeecg-boot:「企业级低代码平台」前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue,Mybatis,Shiro,JWT。强大的代码生成器让前后......
  • Java8-Stream流在项目中的常用方式。
    Java8-Stream流在项目中的常用方式。1.Stream简单介绍​ Stream流是Jdk1.8的高级新特性,它允许允许以声名式的方式处理数据集合,简单来说就是运用流式Api来处理数组、集合......
  • hive初始化报错Exception in thread " main" java.lang.classNotFoundException: org.
    问题:hive初始化报错 解决方法:https://blog.csdn.net/weixin_51946865/article/details/128020686?spm=1001.2014.3001.5502原因:在我的hadoop配置文件hadoop-env.sh(......
  • 【Java】匿名类的初始化
    匿名类语法匿名类是指没有类名的内部类,必须在创建时使用new语句来声明类。其语法形式如下:new<类或接口>(){//类的主体};注意:类不仅限于抽象类匿名类的......
  • Java啤酒问题
    啤酒问题:12块钱买啤酒,2块钱一瓶两个空瓶换一瓶酒四个瓶盖换一瓶酒 最后能买多少啤酒? 问题:统一换算成钱,再买酒,递归实现packagecn.edu.lcudcc;publicclassBe......
  • 二进制文件转Hex和Wav文件转Hex的Java代码
    二进制文件转Hex对于需要将二进制数据写入固件的场景(例如mp3文件),需要将二进制文件表示为byte数组importjava.io.File;importjava.io.FileInputStream;importjav......
  • 27_Java中的方法引用
    Java中的方法引用​ 方法引用是在Lambda的基础进行的,本质是将Lambda中的参数列表传递给我们使用了的方法引用中的方法。(这样在使用一些本就存在的方法完成函数式编......
  • Java核心实操:内存溢出 实战、内存泄漏实战
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • JAVA流程控制
    JAVA流程控制Scanner对象java.util.Scanner是JDK5新特征,我们可以通过Scanner类来获取用户的输入next():一定要读取到有效字符后才可以结束输入对输入有效字符之......