`
zjm16
  • 浏览: 71041 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

jcaptcha(高级)

阅读更多
图片验证:jcaptcha

ImageEngine:

package com.sky;
import java.awt.Font;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.FunkyBackgroundGenerator;
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.RandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
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 ImageCaptchaEngine extends ListImageCaptchaEngine {
protected void buildInitialFactories() {
  // 随机生成的字符   
  WordGenerator wgen = new RandomWordGenerator(
    "abcdefghijklmnopqrstuvwxyz123456789");
  RandomRangeColorGenerator cgen = new RandomRangeColorGenerator(
    new int[] { 0, 100 }, new int[] { 0, 100 },
    new int[] { 0, 100 });
  // 文字显示的个数   
  TextPaster textPaster = new RandomTextPaster(new Integer(6),
    new Integer(6), cgen, true);
  // 图片的大小   
  BackgroundGenerator backgroundGenerator = new FunkyBackgroundGenerator(
    new Integer(150), new Integer(50));
  // 字体格式   
  Font[] fontsList = new Font[] { new Font("Arial", 0, 10),
    new Font("Tahoma", 0, 10), new Font("Verdana", 0, 10), };
  // 文字的大小   
  FontGenerator fontGenerator = new RandomFontGenerator(new Integer(15),
    new Integer(30), fontsList);

  WordToImage wordToImage = new ComposedWordToImage(fontGenerator,
    backgroundGenerator, textPaster);
  this.addFactory(new GimpyFactory(wgen, wordToImage));
}
}

=====================================================================

ImageCaptchaServlet:

public class ImageCaptchaServlet extends HttpServlet {
private static final long serialVersionUID = 3258417209566116145L;

private Log logger = LogFactory.getLog(this.getClass());

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 image captcha service defined via the
   //SpringFramework
   ApplicationContext ctx = WebApplicationContextUtils
     .getRequiredWebApplicationContext(getServletContext());
   Object bean = ctx.getBean("jcaptchaService");
   ImageCaptchaService imageCaptchaService = (ImageCaptchaService) bean;

   // get the id that will identify the generated captcha.
   // the same id must be used to validate the response
   String captchaId = httpServletRequest.getParameter("captchaId");
   logger.debug("captchaIdParameter: "
     + httpServletRequest.getParameter("captchaId"));
   if (captchaId == null) {
    // If a captcha id is not passed in, use the session id
    captchaId = httpServletRequest.getSession().getId();
    logger.debug("httpServletRequest.session.id: "
      + httpServletRequest.getSession().getId());
   }

   logger.debug("captchaId: " + captchaId);
   // call the ImageCaptchaService getChallenge method
   BufferedImage challenge = imageCaptchaService
     .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();
}
}


=============================================================

ValidateJcaptchaAction (struts2 action):

private ImageCaptchaService jcaptchaService;
private String jcaptchaResponse;

public String validateJcaptcha() {

//getRequest() 是我自己写的get request 对象方法 在父类里实现了的
  String id = getRequest().getSession().getId();
  if (StringUtils.isNotBlank(jcaptchaResponse)) {
   Boolean flag = jcaptchaService.validateResponseForID(id,
     jcaptchaResponse);
   if (flag) {
    return SUCCESS;
   }
  }
  return INPUT;
}

public void setJcaptchaService(ImageCaptchaService jcaptchaService) {
  this.jcaptchaService = jcaptchaService;
}

public String getJcaptchaResponse() {
  return jcaptchaResponse;
}

public void setJcaptchaResponse(String jcaptchaResponse) {
  this.jcaptchaResponse = jcaptchaResponse;
}

=====================================================

captcaha.jsp页面:

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

  <title>jcaptcha 使用</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">

  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="java,jcaptcha,验证码,更换图片">
  <meta http-equiv="description" content="java 验证码 javascript">
  <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
</head>

<body>
  <script language="javascript" type="text/javascript">
   function changeImage() {
       //下面两种方法都可以用 
    //document.photo.src='jcaptcha?id=' + Math.random();
    document.getElementById('kaptchaImage').src = 'jcaptcha?id=' + Math.random();
   }
  </script> 
  <table>

   <tr>
    <td>
     <img src="jcaptcha" width="200" id="kaptchaImage"  name="photo" onclick="changeImage();">
    </td>
   </tr>
   <tr>
    <td>   
     <a href="javascript:changeImage();" title="看不清,换一张" tabindex="-2"
      style="color: gray; width: 130px">看不清,换一张</a>
    </td>

  
   </tr>
   <tr>
    <td valign="top">
     <form method="POST" action="verify.action" name="jcaptcha">
      <br>
      请输入验证码:
      <input type="text" name="j_captcha_response" value=''>
      <br>
      <input type="submit" name="submit">

     </form>
    </td>
   </tr>
  </table>
</body>
</html>
=================================================

web.xml:
<servlet>
  <servlet-name>jcaptcha</servlet-name>
  <servlet-class>com.radicasys.signup.jcaptcha.ImageCaptchaServlet</servlet-class>
  <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>jcaptcha</servlet-name>
  <url-pattern>/jcaptcha</url-pattern>
</servlet-mapping>

====================================================

pom.xml设定:

<dependency>
   <groupId>com.octo.captcha</groupId>
   <artifactId>jcaptcha-all</artifactId>
   <version>1.0-RC6</version>
  </dependency>

===================================================

在spring 配置文件里 设定下ValidateJcaptchaAction 和jcaptchaService

applicationContext-service.xml

<bean id="jcaptchaService"
  class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">
  <constructor-arg index="0">
   <ref bean="imageEngine" />
  </constructor-arg>
  <constructor-arg index="1">
   <value>1</value>
  </constructor-arg>
  <constructor-arg index="2">
   <value>180000</value>
  </constructor-arg>
</bean>
<!-- coding  way to set imageEngine-->
  <bean id="imageEngine" class="com.radicasys.signup.jcaptcha.ImageEngine">
  </bean>

applicationCotext-struts.xml

<bean name="jcaptchaAction" class="com.radicasys.signup.jcaptcha.ValidateJcaptchaAction">
  <property name="jcaptchaService" ref="jcaptchaService"/>
</bean>

=======================================================

struts2 配置页面(struts.xml)

<action name="" class="">

<result>你自己的页面</result>

<result name="input">你自己的页面</result>

</action>

基本上就是这样了,不过最好是在spring那里配置图片样式,自己写代码(上面的ImageCaptchaEngine 类)对以后的更改不方便,这里有个参考:你也可以对着那个ImageCaptchaEngine去配置

<bean id="imageEngine"
  class="com.octo.captcha.engine.GenericCaptchaEngine">
  <constructor-arg index="0">
   <list>
    <ref bean="CaptchaFactory" />
   </list>
  </constructor-arg>
</bean>

<bean id="CaptchaFactory"
  class="com.octo.captcha.image.gimpy.GimpyFactory">
  <constructor-arg>
   <ref bean="wordgen" />
  </constructor-arg>
  <constructor-arg>
   <ref bean="wordtoimage" />
  </constructor-arg>
</bean>

<bean id="wordgen"
  class="com.octo.captcha.component.word.wordgenerator.DictionaryWordGenerator">
  <constructor-arg>
   <ref bean="filedict" />
  </constructor-arg>
</bean>

<bean id="wordtoimage"
  class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage">
  <constructor-arg index="0">
   <ref bean="fontGenRandom" />
  </constructor-arg>
  <constructor-arg index="1">
   <ref bean="backGenUni" />
  </constructor-arg>
  <constructor-arg index="2">
   <ref bean="simpleWhitePaster" />
  </constructor-arg>
</bean>

<bean id="filedict"
  class="com.octo.captcha.component.word.FileDictionary">
  <constructor-arg index="0">
   <value>toddlist</value>
  </constructor-arg>
</bean>

<bean id="fontGenRandom"
  class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator">
  <!-- font min -->
  <constructor-arg index="0">
   <value>20</value>
  </constructor-arg>
  <!--font max -->
  <constructor-arg index="1">
   <value>20</value>
  </constructor-arg>
  <constructor-arg index="2">
   <list>
    <ref bean="fontArial" />
   </list>
  </constructor-arg>
</bean>

<bean id="fontArial" class="java.awt.Font">
  <constructor-arg index="0">
   <value>Arial</value>
  </constructor-arg>
  <constructor-arg index="1">
   <value>0</value>
  </constructor-arg>
  <constructor-arg index="2">
   <value>10</value>
  </constructor-arg>
</bean>

<bean id="backGenUni"
  class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
  <!--length -->
  <constructor-arg index="0">
   <value>80</value>
  </constructor-arg>
  <!--hight  -->
  <constructor-arg index="1">
   <value>25</value>
  </constructor-arg>
</bean>
<bean id="simpleWhitePaster"
  class="com.octo.captcha.component.image.textpaster.SimpleTextPaster">
  <!-- min number -->
  <constructor-arg type="java.lang.Integer" index="0">
   <value>4</value>
  </constructor-arg>
  <!--max number -->
  <constructor-arg type="java.lang.Integer" index="1">
   <value>4</value>
  </constructor-arg>
  <!-- color -->
  <constructor-arg type="java.awt.Color" index="2">
   <ref bean="colorGreen" />
  </constructor-arg>
</bean>
<bean id="colorGreen" class="java.awt.Color">
  <constructor-arg index="0">
   <value>0</value>
  </constructor-arg>
  <constructor-arg index="1">
   <value>0</value>
  </constructor-arg>
  <constructor-arg index="2">
   <value>255</value>
  </constructor-arg>
</bean>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bluelzx/archive/2008/01/22/2058505.aspx
分享到:
评论
1 楼 奇林醉 2012-05-15  

相关推荐

    JCaptcha验证码生成

    缺点:对于高级的图像识别技术,JCaptcha可能会被破解,因此需要定期更新验证码的复杂性。 8. **其他验证码技术** 虽然JCaptcha是Java环境下的热门选择,但还有其他验证码解决方案,如Google的reCAPTCHA,它使用了...

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

    ### 安全性 + Jcaptcha (验证码) + MyBatis框架搭建详解 #### 一、项目背景与目标 本文档将详细介绍如何通过整合Spring Security、Jcaptcha和MyBatis框架来构建一个具备安全性验证功能的Web应用。此项目旨在创建一...

    JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。与Hibernate相比,MyBatis更加灵活,允许开发者直接编写SQL,对于复杂查询和性能优化更为友好。 4. **SpringSecurity**: Spring...

    基于SSM实现的注册登录系统。验证码使用jcaptcha,发送邮件使用JEmail.zip

    MyBatis框架,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生...

    验证码资源

    在本资源中,我们看到一个关于验证码的小型...同时,这也是一个很好的起点,帮助开发者进一步探索更高级的安全策略,如滑动验证码、点击验证码等。总的来说,这个验证码资源对于提升网络安全意识和实践技能非常有帮助。

    j'pajcaptcha

    - 对于高级的图像识别技术,可能会被攻破,需要定期更新验证码策略。 - 音频验证码的质量和可用性可能不如图像验证码。 【总结】 jCaptcha作为一款强大的Java验证码库,为Web开发者提供了安全且可定制的验证码解决...

    JAVAAPI官方文档中文版_程序设计.rar

    Java API涵盖了从基本的数据类型、控制结构到高级的网络通信、多线程以及数据库连接等众多内容。这个“JAVAAPI官方文档中文版_程序设计.rar”压缩包包含了Java API的中文版官方文档,对于Java初学者和进阶开发者来说...

    验证码jar包

    `Jcaptcha`,全称Just Another CAPTCHA Toolkit,是一个更加强大的验证码生成工具,它提供了更多的自定义选项和高级特性。除了基本的图像验证码,`Jcaptcha` 还支持音频验证码,以满足视觉障碍用户的需要。`Jcaptcha...

    java验证码

    EasyCaptcha则是一个更现代化的Java验证码库,它支持自定义字体、颜色、背景等属性,同时提供了一些高级特性,如滑动验证码和数学问题验证码。EasyCaptcha的API设计简洁,易于集成到现有的项目中。 **Java验证码...

    acegi资料大全-全集

    `Acegi X_509双向认证 (添加验证码jcaptcha).mht`可能涉及到了基于X.509证书的SSL/TLS客户端认证,这是一种更高级的身份验证方式,常用于企业级应用。同时,结合jCaptcha的使用,可以防止恶意自动化的登录尝试,...

    struts2 验证码----web界面生成几种常见的验证码

    5. **工具使用**:除了Struts2的插件,还有许多第三方库可以帮助我们生成验证码,例如,Google的reCAPTCHA服务,它可以提供更高级的保护,如行为分析,以检测是否为真实人类。这些工具的集成也可以在Struts2项目中...

    jeecms lib2.zip

    4. **jcaptcha-1.0.jar**:这个文件是JCaptcha库,用于生成和验证验证码,防止恶意自动化程序(如机器人)进行表单提交,增加网站的安全性。 5. **spring.aop-3.0.0.jar**:Spring AOP是Spring框架的一部分,提供...

    java图片验证

    - Java社区有一些成熟的验证码库,如 JCaptcha 和 SimpleCaptcha,它们提供了更高级的功能,如自定义字体、噪声、扭曲程度等,可以简化开发过程。 10. **移动设备适配**: - 对于移动设备,可能需要调整验证码的...

    javaweb验证码实现demo

    7. **技术选型**:在Java Web环境中,验证码的实现可以使用纯Java代码,也可以借助第三方库,如JCaptcha或滑动验证码库如SlidCaptcha。这些库提供了更高级的功能,如自定义样式和更好的抗机器学习算法。 8. **用户...

    几种jsp验证码的生成(免费)

    - 高级验证码可能涉及更复杂的交互,例如滑动验证码让用户拖动一个部分以匹配背景,或者点击指定的图片元素。这种验证码需要更多的JavaScript和服务器端逻辑配合。在JSP中,可以使用AJAX与后台交互,实现动态验证。...

    java常用工具类

    5. **验证码生成**:通常使用第三方库如EasyCAPTCHA或JCaptcha来生成图形验证码。这些库提供配置验证码的长度、字体、颜色、扭曲程度等功能,生成的验证码可以防止自动化程序的恶意操作。 6. **数据连接池**:数据...

    springboot实例

    1. **SpringBoot 整合 MyBatis**:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。SpringBoot 整合 MyBatis 可以极大地简化数据库操作。首先,我们需要在 `pom.xml` 文件中引入 MyBatis ...

    JAVA课程,验证码的制作

    8. **验证码库的使用**:JAVA有许多现成的验证码库,如JCaptcha和EasyCaptcha,它们提供了丰富的功能,如自定义样式、文本和图像的组合,以及更高级的安全特性。使用这些库可以快速地在项目中集成验证码功能。 9. *...

    Java语言开发的登陆模块源码

    10. **多因素认证**:高级的登录系统可能还支持多因素认证(MFA),如短信验证码或生物识别,以提供额外的安全层。 在Eclipse中,开发者可以方便地组织代码,利用Maven或Gradle进行依赖管理,使用JUnit进行单元测试...

    用JAVA实现验证码的绘制

    验证码是一种常用的网络安全机制,用于防止自动化程序(如机器人)对网站进行恶意操作。...在开发过程中,可以参考开源的验证码库,如JCaptcha或Google的CAPTCHA服务,以获取更高级的功能和安全性。

Global site tag (gtag.js) - Google Analytics