`
xucunliang
  • 浏览: 52882 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

使用JCaptcha生成验证码

    博客分类:
  • WEB
阅读更多

使用JCaptcha工具包生成验证码

JCaptcha 官网地址 http://forge.octo.com/jcaptcha/confluence/display/general/Home

引入Lib包 (包括一些依赖包commons-collections等

从Servlet看起

 <!-- 验证码Servlet -->
  <servlet>
   <servlet-name>jcaptcha</servlet-name>
   <servlet-class>com.ighost.cms.common.checkcode.ImageCaptchaServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>jcaptcha</servlet-name>
   <url-pattern>/CheckCode.svl</url-pattern>
  </servlet-mapping>

 package com.ighost.cms.common.checkcode;

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

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 org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 验证码生成Servlet
 * @author ghost
 *
 */
@SuppressWarnings("serial")
public class ImageCaptchaServlet extends HttpServlet {

 //验证码生成类
 private ImageCaptchaService imageCaptchaService;
 //Spring中的配置名称
 private String beanName = "imageCaptchaService";
 
 /**
  * 初始化ImageCaptchaService 对象
  */
 @Override
 public void init(ServletConfig config) throws ServletException {
  System.out.println("servlet init is in");
  super.init(config);
  WebApplicationContext context = WebApplicationContextUtils
           .getWebApplicationContext(config.getServletContext());
  imageCaptchaService = (ImageCaptchaService)context.getBean(beanName,ImageCaptchaService.class);
 }
 
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   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 = req.getSession().getId();
   // call the ImageCaptchaService getChallenge method
   BufferedImage challenge = imageCaptchaService
     .getImageChallengeForID(captchaId, req.getLocale());

   // a jpeg encoder
   JPEGImageEncoder jpegEncoder = JPEGCodec
     .createJPEGEncoder(jpegOutputStream);
   jpegEncoder.encode(challenge);
  } catch (IllegalArgumentException e) {
   resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   return;
  } catch (CaptchaServiceException e) {
   resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   return;
  }

  captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

  // flush it in the response
  resp.setHeader("Cache-Control", "no-store");
  resp.setHeader("Pragma", "no-cache");
  resp.setDateHeader("Expires", 0);
  resp.setContentType("image/jpeg");
  ServletOutputStream responseOutputStream = resp.getOutputStream();
  responseOutputStream.write(captchaChallengeAsJpeg);
  responseOutputStream.flush();
  responseOutputStream.close();
 }

}

Servlet中需要的类在Bean中的配置

 <!-- 验证码生成器 -->
 <bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/>
 <bean id="captchaEngineEx" class="com.ighost.cms.common.checkcode.CaptchaEngineEx"/>
 <bean id="imageCaptchaService" class="com.ighost.cms.common.checkcode.CaptchaService">
  <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">
   <ref bean="fastHashMapCaptchaStore"/>
  </constructor-arg>
  <constructor-arg type="com.octo.captcha.engine.CaptchaEngine" index="1">
   <ref bean="captchaEngineEx"/>
  </constructor-arg>
  <constructor-arg index="2">
   <value>180</value>   
  </constructor-arg>
  <constructor-arg index="3">
   <value>100000</value>   
  </constructor-arg>
  <constructor-arg index="4">
   <value>75000</value>   
  </constructor-arg> 
 </bean>

具体完成生成的类

 package com.ighost.cms.common.checkcode;

import com.octo.captcha.engine.CaptchaEngine;
import com.octo.captcha.service.captchastore.CaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

/*
 * 自定义的验证码生成器
 */
public class CaptchaService extends DefaultManageableImageCaptchaService {

 public CaptchaService(){
  super();
 }
 
 /**
  * @param minSeconds
  * @param maxStoreSize 最大缓存大小
  * @param loadBefore
  */
 public CaptchaService(int minSeconds, int maxStoreSize, int loadBefore){
  super(minSeconds, maxStoreSize, loadBefore);
 }
 
 public CaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine,
       int minSeconds, int maxStroreSize, int loadBefore){
  super(captchaStore, captchaEngine, minSeconds, maxStroreSize, loadBefore);
 }
 
 /**
  * 重写验证方法
  * 掩盖异常 当出现异常时判定为验证失败
  */
 @Override
 public Boolean validateResponseForID(String ID, Object response) {
  Boolean isHuman;
  
  try{
   isHuman = super.validateResponseForID(ID, response);
  }
  catch(Exception e){
   isHuman = false;   
  }
  
  return isHuman;
 }
}

 package com.ighost.cms.common.checkcode;

import java.awt.Color;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
import com.octo.captcha.component.image.color.SingleColorGenerator;
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.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;

/**
 * 自定义的验证码生成引擎
 * @author ghost
 *
 */
public class CaptchaEngineEx extends ListImageCaptchaEngine {

 /**
  * 生成验证码的具体方法
  */
 @Override
 protected void buildInitialFactories() {
  
  //验证码的最小长度
  Integer minAcceptedWordLength = new Integer(4);
  //验证码的最大长度
  Integer maxAcceptedWordLength = new Integer(5);
  
  //验证码图片的高度宽度设定
  Integer imageHeight = new Integer(40);
  Integer imageWidth = new Integer(100);
  
  //验证码中显示的字体大小
  Integer minFontSize = new Integer(20);
  Integer maxFontSize = new Integer(22);
  
  //随机字符生成
  //abcdefghijklmnopqrstuvwxyz
  WordGenerator wordGenerator = new RandomWordGenerator("0123456789");
  
  //背景颜色随机生成
  BackgroundGenerator backgroundGenerator = new GradientBackgroundGenerator(
    imageWidth, imageHeight, Color.white,Color.white);
 
  //字体随机生成
  FontGenerator fontGenerator = new RandomFontGenerator(minFontSize, maxFontSize);
  
  //验证码的颜色
  SingleColorGenerator singleColor = new SingleColorGenerator(Color.blue);
  
  BaffleTextDecorator baffleTextDecorator = new BaffleTextDecorator(1, Color.white);
  //可以创建多个
  //LineTextDecorator lineTextDecorator = new LineTextDecorator(1, Color.blue);
  //TextDecorator[] textDecorator = new TextDecorator[2];
  //textDecorator[0] = lineTextDecorator;
  TextDecorator[] textDecorator = new TextDecorator[1];
  textDecorator[0] = baffleTextDecorator;
  
  TextPaster textPaster = new DecoratedRandomTextPaster(
    minAcceptedWordLength, maxAcceptedWordLength, singleColor,textDecorator);
  //生成图片输出
  WordToImage wordToImage = new ComposedWordToImage(
    fontGenerator, backgroundGenerator, textPaster);
  
  addFactory(new GimpyFactory(wordGenerator, wordToImage)); 
 }

}

最后在jsp页面中只需使用如下调用即可

<img id="checkcode" alt="看不清,点击换一张" src="../CheckCode.svl" border="1px" onclick="this.src='../CheckCode.svl?date=' + new Date().getTime()">

 

分享到:
评论
1 楼 18862611051 2015-05-01  
[flash=200,200][url][img][list]
[*]
引用
[u][u][i][i][b][b][/b][/b][/i][/i][/u][/u]
[/list][/img][/url][/flash]

相关推荐

    jcaptcha生成验证码demo

    在JSP下,用jcaptcha生成彩色验证码的案例。 主页http://jcaptcha.sourceforge.net/ 网上有很多例子,但有一点没说清楚,这个项目的jar包需要两个apache的项目包,一个是collections,还有一个是logging。 我做了...

    Jcaptcha(java验证码生成框架)使用说明(原创)

    该框架提供了生成验证码图像通用解决办法,提供了非常灵活的生成验证码图像的框架,可以自由的组合生成图像过程中的各种元素,例如,字体、颜色、背景、扭曲样式等。 二、框架的安装 框架的安装没有任何困难,直接...

    java通过JCaptcha生成验证码

    Java 通过 JCaptcha 生成验证码是一项常见的安全技术,用于防止自动化程序(如机器人)非法访问或操作网站。验证码,全称“全自动区分计算机和人类的图灵测试”,是一种验证用户是否为人类的方法。在此,我们将深入...

    java jcaptcha 验证码 生成

    - **生成验证码**:调用`CaptchaService`的`getChallengeForID()`方法,传入一个唯一标识,返回一个包含验证码图像和对应的文本的`DefaultCaptcha`对象。 - **保存验证码**:通常将验证码的文本部分存储在会话...

    JCaptcha验证码生成

    3. **使用JCaptcha生成验证码** JCaptcha提供了`CaptchaService`接口,用于生成和验证验证码。开发人员可以使用`DefaultCaptchaService`实现,通过调用`createCaptcha()`方法生成验证码图像,并将其保存在session中...

    JAVA基于JCaptcha生成验证码图片传给前端

    在Java中,我们可以使用开源库JCaptcha来生成验证码图片,并将其传递给前端以供用户验证。下面将详细介绍如何实现这一过程。 首先,JCaptcha是一个Java CAPTCHA(Completely Automated Public Turing test to tell ...

    Jcaptcha 彩色验证码实例

    以下是一个简单的示例代码,展示如何使用Jcaptcha生成一个彩色验证码: ```java import com.octo.captcha.component.image.backgroundgenerator.RandomListBackgroundGenerator; import ...

    jcaptcha的验证码例子

    3. **在JSP页面上显示验证码**:使用`jcaptcha.tld`中的标签在表单页面上生成验证码图像。 4. **处理验证结果**:如果验证码验证失败,可以返回错误消息并重新显示验证码,或者阻止进一步的操作。 在实际开发中,你...

    JCaptcha生成图形验证码以及校验

    JCaptcha生成图形验证码以及校验

    jcaptcha 彩色验证码-下载即可使用

    3. **生成验证码**:在服务器端调用 jCaptcha API 生成验证码图像,并将其发送给客户端。 4. **显示验证码**:在网页上显示生成的验证码图像,通常通过 HTTP 响应的“image/*”类型返回。 5. **验证用户输入**:当...

    jcaptcha写验证码要用到的jar包

    以上就是使用Jcaptcha生成和验证验证码所需的关键知识点。在实际开发中,开发者需要根据项目需求调整和优化这些步骤,确保验证码机制既安全又易于使用。参考链接中的博客文章...

    security+jcaptcha(验证码)+mybatis框架搭建

    4. **集成Jcaptcha**:配置Jcaptcha来生成验证码图片,并在登录页面上展示。 5. **数据持久化**:利用MyBatis进行数据库操作,如用户信息的增删改查等。 6. **测试**:编写测试用例来验证系统的功能性和安全性。 ...

    用jcaptcha插件生成验证码

    项目通过使用jcaptcha插件,实现了一个简单的验证码生成的功能。

    security+jcaptcha(验证码)框架搭建

    - **JCaptcha**:用于生成验证码。 - **Spring Web MVC**:用于支持 Web 层的功能。 - **Spring Context Support**:提供上下文支持。 - **Velocity**:模板引擎,用于生成验证码图片。 - **SLF4J API**:日志框架。...

    jcaptcha-sample_验证码生成

    这通常涉及到在请求处理方法中生成验证码,在表单提交时验证验证码。 5. **安全存储与清理**:生成的验证码需要临时存储,以便与用户的输入进行比较。在成功验证后,应立即清除验证码,防止重用。这可能涉及到 ...

    验证码 验证码例子 jcaptcha jcaptcha例子

    2. 创建验证码:在服务器端,使用jCaptcha API生成验证码,并将其存储在会话(Session)中。 3. 显示验证码:将生成的验证码图像发送到客户端,一般通过HTTP响应流的方式。 4. 用户输入:用户在前端页面输入看到的...

    通过spring整合jcaptcha来处理验证码

    通过以上步骤,我们就可以在Spring应用中成功地整合并使用jCaptcha生成和验证验证码,提高系统的安全性。在实际项目中,可以根据具体需求进一步优化和扩展此功能,例如实现动态加载验证码、多语言支持等。

    Java验证码生成库 JCaptcha

    Java验证码生成库 JCaptcha

    java验证码组件Jcaptcha

    1. **安全性**:Jcaptcha生成的验证码具有一定的复杂性,通过随机字符、颜色、扭曲等方式,使得自动化程序难以识别,有效保护了网站的安全。 2. **可定制化**:开发者可以根据项目需求自定义验证码的样式,包括字符...

Global site tag (gtag.js) - Google Analytics