`

验证码

    博客分类:
  • java
阅读更多
转自:http://flattop.iteye.com/blog/146135
1、从jcaptcha官方网站下载jcaptcha的发行包,并将其发行包中的jar文件考贝到本地项目WEB-INF目录下的lib目录中。

官方网址http://jcaptcha.sourceforge.net/

2、在web.xml文件中配置
Java代码
<servlet>  
     <servlet-name>jcaptcha</servlet-name>  
     <servlet-class>cn.hxex.order.core.jcaptcha.ImageCaptchaServlet</servlet-class>  
     <load-on-startup>3</load-on-startup>  
</servlet>  
 
<servlet-mapping>  
     <servlet-name>jcaptcha</servlet-name>  
     <url-pattern>/captcha.jpg</url-pattern>  
</servlet-mapping> 

<servlet>
      <servlet-name>jcaptcha</servlet-name>
      <servlet-class>cn.hxex.order.core.jcaptcha.ImageCaptchaServlet</servlet-class>
      <load-on-startup>3</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>jcaptcha</servlet-name>
      <url-pattern>/captcha.jpg</url-pattern>
  </servlet-mapping>


3、jcaptcha在spring中的配置
Java代码
    <bean id="channelProcessingFilter" 
          class="org.acegisecurity.securechannel.ChannelProcessingFilter">  
        <property name="channelDecisionManager">  
            <ref local="channelDecisionManager"/>   
        </property>  
        <property name="filterInvocationDefinitionSource">  
            <value>  
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
                PATTERN_TYPE_APACHE_ANT  
                /j_security_check=REQUIRES_CAPTCHA_ONCE_ABOVE_THRESOLD_REQUESTS  
            </value>  
        </property>  
    </bean>  
 
    <bean id="channelDecisionManager" 
          class="org.acegisecurity.securechannel.ChannelDecisionManagerImpl">  
        <property name="channelProcessors">   
            <list>  
                <ref local="testOnceAfterMaxRequestsCaptchaChannelProcessor"/>  
                <ref local="alwaysTestAfterTimeInMillisCaptchaChannelProcessor"/>  
                <ref local="alwaysTestAfterMaxRequestsCaptchaChannelProcessor"/>  
                <ref local="alwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor"/>  
            </list>  
        </property>  
    </bean>  
 
    <!-- REQUIRES_CAPTCHA_ONCE_ABOVE_THRESOLD_REQUESTS -->  
    <bean id="testOnceAfterMaxRequestsCaptchaChannelProcessor" 
          class="org.acegisecurity.captcha.TestOnceAfterMaxRequestsCaptchaChannelProcessor">  
        <property name="thresold">  
            <value>0</value>  
        </property>  
        <property name="entryPoint">  
            <ref bean="captchaEntryPoint"/>  
        </property>  
    </bean>  
 
    <!-- REQUIRES_CAPTCHA_ABOVE_THRESOLD_REQUESTS -->  
    <bean id="alwaysTestAfterMaxRequestsCaptchaChannelProcessor" 
          class="org.acegisecurity.captcha.AlwaysTestAfterMaxRequestsCaptchaChannelProcessor">  
        <property name="thresold">  
            <value>5</value>  
        </property>  
        <property name="entryPoint">  
            <ref bean="captchaEntryPoint"/>  
        </property>  
    </bean>  
 
    <!-- REQUIRES_CAPTCHA_AFTER_THRESOLD_IN_MILLIS -->  
    <bean id="alwaysTestAfterTimeInMillisCaptchaChannelProcessor" 
          class="org.acegisecurity.captcha.AlwaysTestAfterTimeInMillisCaptchaChannelProcessor">  
        <property name="thresold">  
            <value>5000</value>  
        </property>  
        <property name="entryPoint">  
            <ref bean="captchaEntryPoint"/>  
        </property>  
    </bean>  
 
    <!-- REQUIRES_CAPTCHA_BELOW_AVERAGE_TIME_IN_MILLIS_REQUESTS -->  
       
    <bean  
            id="alwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor" 
            class="org.acegisecurity.captcha.AlwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor">  
        <property name="thresold">  
            <value>20000</value>  
        </property>  
        <property name="entryPoint">  
            <ref bean="captchaEntryPoint"/>  
        </property>  
    </bean>  
 
    <bean id="captchaEntryPoint" 
          class="org.acegisecurity.captcha.CaptchaEntryPoint">  
        <!--验证码验证失败后转向的页面!-->  
        <property name="captchaFormUrl">  
            <value>/admin/login.jsp?login_error=code_error</value>  
        </property>  
        <property name="includeOriginalRequest">  
            <value>false</value>  
        </property>  
        <property name="includeOriginalParameters">  
            <value>false</value>  
        </property>  
    </bean>  
 
    <bean id="captchaValidationProcessingFilter" 
          class="org.acegisecurity.captcha.CaptchaValidationProcessingFilter">  
        <property name="captchaService">  
            <ref bean="captchaService"/>  
        </property>  
        <property name="captchaValidationParameter" value="j_captcha_response"/>  
    </bean>  
      
    <!-- imageCaptchaService is injected into captchaImageCreateController as well as to captchaService beans -->  
   <!--自己定义的实体类(注意路径!!)-->  
    <bean id="captchaService" class="cn.hxex.order.core.jcaptcha.JCaptchaServiceProxyImpl">  
        <property name="jcaptchaService" ref="imageCaptchaService"/>  
    </bean>  
      
    <bean id="imageCaptchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">  
        <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">  
            <ref bean="fastHashMapCaptchaStore"/>  
        </constructor-arg>  
        <!-- (1) which captcha Engine you use -->  
        <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>  
 
    <bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/>  
 
    <!-- (2) you can define more than one captcha engine here -->  
    <bean id="captchaEngineEx" 
          class="cn.hxex.order.core.jcaptcha.engine.CaptchaEngineEx">        
    </bean>  
 
         <bean id="filterChainProxy" 
        class="org.acegisecurity.util.FilterChainProxy">  
        <property name="filterInvocationDefinitionSource">   
            <value>  
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
                PATTERN_TYPE_APACHE_ANT  
                /**=httpSessionContextIntegrationFilter,captchaValidationProcessingFilter,channelProcessingFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor  
            </value>  
        </property>  
    </bean>  
 
         <bean id="httpSessionContextIntegrationFilter" 
        class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">  
        <!-- 将下面的property注释掉,验证码将无效!!! -->  
        <property name="context">  
            <value>  
                org.acegisecurity.captcha.CaptchaSecurityContextImpl  
            </value>  
        </property>  
    </bean>  
·············省略了一些spring安全框架的bean,自己加去吧 

    <bean id="channelProcessingFilter"
          class="org.acegisecurity.securechannel.ChannelProcessingFilter">
        <property name="channelDecisionManager">
            <ref local="channelDecisionManager"/>
        </property>
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /j_security_check=REQUIRES_CAPTCHA_ONCE_ABOVE_THRESOLD_REQUESTS
            </value>
        </property>
    </bean>

    <bean id="channelDecisionManager"
          class="org.acegisecurity.securechannel.ChannelDecisionManagerImpl">
        <property name="channelProcessors">
            <list>
                <ref local="testOnceAfterMaxRequestsCaptchaChannelProcessor"/>
                <ref local="alwaysTestAfterTimeInMillisCaptchaChannelProcessor"/>
                <ref local="alwaysTestAfterMaxRequestsCaptchaChannelProcessor"/>
                <ref local="alwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor"/>
            </list>
        </property>
    </bean>

    <!-- REQUIRES_CAPTCHA_ONCE_ABOVE_THRESOLD_REQUESTS -->
    <bean id="testOnceAfterMaxRequestsCaptchaChannelProcessor"
          class="org.acegisecurity.captcha.TestOnceAfterMaxRequestsCaptchaChannelProcessor">
        <property name="thresold">
            <value>0</value>
        </property>
        <property name="entryPoint">
            <ref bean="captchaEntryPoint"/>
        </property>
    </bean>

    <!-- REQUIRES_CAPTCHA_ABOVE_THRESOLD_REQUESTS -->
    <bean id="alwaysTestAfterMaxRequestsCaptchaChannelProcessor"
          class="org.acegisecurity.captcha.AlwaysTestAfterMaxRequestsCaptchaChannelProcessor">
        <property name="thresold">
            <value>5</value>
        </property>
        <property name="entryPoint">
            <ref bean="captchaEntryPoint"/>
        </property>
    </bean>

    <!-- REQUIRES_CAPTCHA_AFTER_THRESOLD_IN_MILLIS -->
    <bean id="alwaysTestAfterTimeInMillisCaptchaChannelProcessor"
          class="org.acegisecurity.captcha.AlwaysTestAfterTimeInMillisCaptchaChannelProcessor">
        <property name="thresold">
            <value>5000</value>
        </property>
        <property name="entryPoint">
            <ref bean="captchaEntryPoint"/>
        </property>
    </bean>

    <!-- REQUIRES_CAPTCHA_BELOW_AVERAGE_TIME_IN_MILLIS_REQUESTS -->
    
    <bean
            id="alwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor"
            class="org.acegisecurity.captcha.AlwaysTestBelowAverageTimeInMillisBetweenRequestsChannelProcessor">
        <property name="thresold">
            <value>20000</value>
        </property>
        <property name="entryPoint">
            <ref bean="captchaEntryPoint"/>
        </property>
    </bean>

    <bean id="captchaEntryPoint"
          class="org.acegisecurity.captcha.CaptchaEntryPoint">
        <!--验证码验证失败后转向的页面!-->
        <property name="captchaFormUrl">
            <value>/admin/login.jsp?login_error=code_error</value>
        </property>
        <property name="includeOriginalRequest">
            <value>false</value>
        </property>
        <property name="includeOriginalParameters">
            <value>false</value>
        </property>
    </bean>

    <bean id="captchaValidationProcessingFilter"
          class="org.acegisecurity.captcha.CaptchaValidationProcessingFilter">
        <property name="captchaService">
            <ref bean="captchaService"/>
        </property>
        <property name="captchaValidationParameter" value="j_captcha_response"/>
    </bean>
   
    <!-- imageCaptchaService is injected into captchaImageCreateController as well as to captchaService beans -->
   <!--自己定义的实体类(注意路径!!)-->
    <bean id="captchaService" class="cn.hxex.order.core.jcaptcha.JCaptchaServiceProxyImpl">
        <property name="jcaptchaService" ref="imageCaptchaService"/>
    </bean>
   
    <bean id="imageCaptchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">
        <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">
            <ref bean="fastHashMapCaptchaStore"/>
        </constructor-arg>
        <!-- (1) which captcha Engine you use -->
        <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>

    <bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/>

    <!-- (2) you can define more than one captcha engine here -->
    <bean id="captchaEngineEx"
          class="cn.hxex.order.core.jcaptcha.engine.CaptchaEngineEx">     
    </bean>

         <bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,captchaValidationProcessingFilter,channelProcessingFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
</value>
</property>
</bean>

         <bean id="httpSessionContextIntegrationFilter"
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">
<!-- 将下面的property注释掉,验证码将无效!!! -->
<property name="context">
<value>
org.acegisecurity.captcha.CaptchaSecurityContextImpl
</value>
</property>
</bean>
·············省略了一些spring安全框架的bean,自己加去吧


4、编写jcaptcha的实体类

实体类包的路径一定要和spring配置文件里的路径一样

(1)CaptchaEngine 类
Java代码
package cn.hxex.order.core.jcaptcha.engine;  
 
import java.awt.Color;  
 
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;  
import com.octo.captcha.component.image.backgroundgenerator  
  .FunkyBackgroundGenerator;  
import com.octo.captcha.component.image.fontgenerator.FontGenerator;  
import com.octo.captcha.component.image.fontgenerator  
  .TwistedAndShearedRandomFontGenerator;  
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;  
 
/** 
* SpringSide Custom的认证图片 
*  
* @author cac 
*/ 
public class CaptchaEngine extends ListImageCaptchaEngine {  
  /** 
   * @see ListImageCaptchaEngine 
   */ 
  protected void buildInitialFactories() {  
    WordGenerator wordGenerator   
      = new RandomWordGenerator("023456789");  
    // nteger minAcceptedWordLength, Integer maxAcceptedWordLength,Color[]  
    // textColors  
    TextPaster textPaster = new RandomTextPaster(4,5, Color.WHITE);  
    // Integer width, Integer height  
    BackgroundGenerator backgroundGenerator   
      = new FunkyBackgroundGenerator(100,40);  
    // Integer minFontSize, Integer maxFontSize  
    FontGenerator fontGenerator = new TwistedAndShearedRandomFontGenerator(20, 22);  
    WordToImage wordToImage = new ComposedWordToImage(fontGenerator,  
        backgroundGenerator, textPaster);  
    addFactory(new GimpyFactory(wordGenerator, wordToImage));  
  }  


package cn.hxex.order.core.jcaptcha.engine;

import java.awt.Color;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator
  .FunkyBackgroundGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator
  .TwistedAndShearedRandomFontGenerator;
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;

/**
* SpringSide Custom的认证图片
*
* @author cac
*/
public class CaptchaEngine extends ListImageCaptchaEngine {
  /**
   * @see ListImageCaptchaEngine
   */
  protected void buildInitialFactories() {
    WordGenerator wordGenerator
      = new RandomWordGenerator("023456789");
    // nteger minAcceptedWordLength, Integer maxAcceptedWordLength,Color[]
    // textColors
    TextPaster textPaster = new RandomTextPaster(4,5, Color.WHITE);
    // Integer width, Integer height
    BackgroundGenerator backgroundGenerator
      = new FunkyBackgroundGenerator(100,40);
    // Integer minFontSize, Integer maxFontSize
    FontGenerator fontGenerator = new TwistedAndShearedRandomFontGenerator(20, 22);
    WordToImage wordToImage = new ComposedWordToImage(fontGenerator,
        backgroundGenerator, textPaster);
    addFactory(new GimpyFactory(wordGenerator, wordToImage));
  }
}


(2)CaptchaEngineEx 类
Java代码
package cn.hxex.order.core.jcaptcha.engine;  
 
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  
  .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;  
 
 
/** 
* Captcha增强版本 
*  
* @author david.turing@gmail.com 
* @modifyTime 21:01:52 
* @description  
* <pre> 
*  安装 Captcha Instruction <br> 
*  1.add captchaValidationProcessingFilter  
*    to applicationContext-acegi-security.xml<br> 
*  2.modify applicationContext-captcha-security.xml 
*    <ul> 
*    <li> make sure that captchaValidationProcessingFilter Call captchaService 
      <li> config CaptchaEngine for captchaService (refer imageCaptchaService)  
      <li> write your own CaptchaEngine 
      <li> config the following, so that We use CaptchaEngineEx to generate the  
          captcha image.  
      </ul> 
          <constructor-arg 
*              type="com.octo.captcha.engine.CaptchaEngine" index="1">  
*              <ref bean="captchaEngineEx"/gt; </constructor-arg>  
* </pre> 
*/ 
public class CaptchaEngineEx extends ListImageCaptchaEngine {  
  /** 
   * ... 
   */ 
  protected void buildInitialFactories() {  
      
     //Set Captcha Word Length Limitation which should not over 6       
    Integer minAcceptedWordLength = new Integer(4);  
    Integer maxAcceptedWordLength = new Integer(5);  
    //Set up Captcha Image Size: Height and Width      
    Integer imageHeight = new Integer(40);  
    Integer imageWidth = new Integer(100);  
      
    //Set Captcha Font Size      
    Integer minFontSize = new Integer(20);  
    Integer maxFontSize = new Integer(22);  
    //We just generate digit for captcha source char Although you can use  
    //abcdefg......xyz  
    WordGenerator wordGenerator   
      = new RandomWordGenerator("023456789");  
   
     //cyt and unruledboy proved that backgroup not a factor of Security. A  
     //captcha attacker won't affaid colorful backgroud, so we just use white  
     //color, like google and hotmail.    
    BackgroundGenerator backgroundGenerator = new GradientBackgroundGenerator(  
        imageWidth, imageHeight, Color.white, Color.white);  
    
     //font is not helpful for security but it really increase difficultness for  
     //attacker       
    FontGenerator fontGenerator = new RandomFontGenerator(minFontSize,  
        maxFontSize);      
     // Note that our captcha color is Blue       
    SingleColorGenerator scg = new SingleColorGenerator(Color.blue);  
    
     //decorator is very useful pretend captcha attack. we use two line text  
     //decorators.  
       
    LineTextDecorator lineDecorator = new LineTextDecorator(1, Color.blue);  
    // LineTextDecorator line_decorator2 = new LineTextDecorator(1, Color.blue);  
    TextDecorator[] textdecorators = new TextDecorator[1];  
 
    textdecorators[0] = lineDecorator;  
    // textdecorators[1] = line_decorator2;  
 
    TextPaster textPaster = new DecoratedRandomTextPaster(  
        minAcceptedWordLength, maxAcceptedWordLength, scg,  
        new TextDecorator[] { new BaffleTextDecorator(new Integer(1),  
            Color.white) });  
 
    //ok, generate the WordToImage Object for logon service to use.  
    WordToImage wordToImage = new ComposedWordToImage(  
        fontGenerator, backgroundGenerator, textPaster);  
    addFactory(new GimpyFactory(wordGenerator, wordToImage));  
  }  
 


package cn.hxex.order.core.jcaptcha.engine;

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
  .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;


/**
* Captcha增强版本
*
* @author david.turing@gmail.com
* @modifyTime 21:01:52
* @description
* <pre>
*  安装 Captcha Instruction <br>
*  1.add captchaValidationProcessingFilter
*    to applicationContext-acegi-security.xml<br>
*  2.modify applicationContext-captcha-security.xml
*    <ul>
*    <li> make sure that captchaValidationProcessingFilter Call captchaService
      <li> config CaptchaEngine for captchaService (refer imageCaptchaService)
      <li> write your own CaptchaEngine
      <li> config the following, so that We use CaptchaEngineEx to generate the
          captcha image.
      </ul>
          <constructor-arg
*              type="com.octo.captcha.engine.CaptchaEngine" index="1">
*              <ref bean="captchaEngineEx"/gt; </constructor-arg>
* </pre>
*/
public class CaptchaEngineEx extends ListImageCaptchaEngine {
  /**
   * ...
   */
  protected void buildInitialFactories() {
   
     //Set Captcha Word Length Limitation which should not over 6    
    Integer minAcceptedWordLength = new Integer(4);
    Integer maxAcceptedWordLength = new Integer(5);
    //Set up Captcha Image Size: Height and Width   
    Integer imageHeight = new Integer(40);
    Integer imageWidth = new Integer(100);
   
    //Set Captcha Font Size   
    Integer minFontSize = new Integer(20);
    Integer maxFontSize = new Integer(22);
    //We just generate digit for captcha source char Although you can use
    //abcdefg......xyz
    WordGenerator wordGenerator
      = new RandomWordGenerator("023456789");

     //cyt and unruledboy proved that backgroup not a factor of Security. A
     //captcha attacker won't affaid colorful backgroud, so we just use white
     //color, like google and hotmail. 
    BackgroundGenerator backgroundGenerator = new GradientBackgroundGenerator(
        imageWidth, imageHeight, Color.white, Color.white);
 
     //font is not helpful for security but it really increase difficultness for
     //attacker    
    FontGenerator fontGenerator = new RandomFontGenerator(minFontSize,
        maxFontSize);   
     // Note that our captcha color is Blue    
    SingleColorGenerator scg = new SingleColorGenerator(Color.blue);
 
     //decorator is very useful pretend captcha attack. we use two line text
     //decorators.
    
    LineTextDecorator lineDecorator = new LineTextDecorator(1, Color.blue);
    // LineTextDecorator line_decorator2 = new LineTextDecorator(1, Color.blue);
    TextDecorator[] textdecorators = new TextDecorator[1];

    textdecorators[0] = lineDecorator;
    // textdecorators[1] = line_decorator2;

    TextPaster textPaster = new DecoratedRandomTextPaster(
        minAcceptedWordLength, maxAcceptedWordLength, scg,
        new TextDecorator[] { new BaffleTextDecorator(new Integer(1),
            Color.white) });

    //ok, generate the WordToImage Object for logon service to use.
    WordToImage wordToImage = new ComposedWordToImage(
        fontGenerator, backgroundGenerator, textPaster);
    addFactory(new GimpyFactory(wordGenerator, wordToImage));
  }

}


(3)ImageCaptchaServlet 类

Java代码
package cn.hxex.order.core.jcaptcha;  
 
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;  
import org.apache.commons.lang.StringUtils;  
import org.springframework.context.ApplicationContext;  
import org.springframework.web.context.support.WebApplicationContextUtils;  
 
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 java.awt.image.BufferedImage;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
 
/** 
* Servlet generates CAPTCHA jpeg images based on the JCAPTCHA package. It's 
* configured via spring, and requires a ImageCaptchaService bean with the 
* id=imageCaptchaService 
* 基于JCAPTCHA生成CAPTCHA jpeg图片的Servlet。它通过Spring进行配置,并且set一个 
* 类型为ImageCaptchaService,id为imageCaptchaService的bean 
* @author Jason Thrasher 
*/ 
@SuppressWarnings("serial")  
public class ImageCaptchaServlet extends HttpServlet {  
  /** 
   * Captcha Service Name 
   */ 
  private String captchaServiceName = "imageCaptchaService";  
  /** 
   * @see HttpServlet#init(ServletConfig) 
   */ 
  public void init(ServletConfig servletConfig) throws ServletException {  
    if (StringUtils.isNotBlank(servletConfig  
        .getInitParameter("captchaServiceName"))) {  
      captchaServiceName = servletConfig.getInitParameter("captchaServiceName");  
    }  
 
    super.init(servletConfig);  
  }  
  /** 
   * @see HttpServlet#doGet() 
   */ 
  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(captchaServiceName);  
      ImageCaptchaService imageCaptchaService = (ImageCaptchaService) bean;  
 
      // 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 = httpServletRequest.getSession().getId();  
      // 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();  
  }  


package cn.hxex.order.core.jcaptcha;

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;
import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

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 java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
* Servlet generates CAPTCHA jpeg images based on the JCAPTCHA package. It's
* configured via spring, and requires a ImageCaptchaService bean with the
* id=imageCaptchaService
* 基于JCAPTCHA生成CAPTCHA jpeg图片的Servlet。它通过Spring进行配置,并且set一个
* 类型为ImageCaptchaService,id为imageCaptchaService的bean
* @author Jason Thrasher
*/
@SuppressWarnings("serial")
public class ImageCaptchaServlet extends HttpServlet {
  /**
   * Captcha Service Name
   */
  private String captchaServiceName = "imageCaptchaService";
  /**
   * @see HttpServlet#init(ServletConfig)
   */
  public void init(ServletConfig servletConfig) throws ServletException {
    if (StringUtils.isNotBlank(servletConfig
        .getInitParameter("captchaServiceName"))) {
      captchaServiceName = servletConfig.getInitParameter("captchaServiceName");
    }

    super.init(servletConfig);
  }
  /**
   * @see HttpServlet#doGet()
   */
  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(captchaServiceName);
      ImageCaptchaService imageCaptchaService = (ImageCaptchaService) bean;

      // 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 = httpServletRequest.getSession().getId();
      // 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();
  }
}


(4)JCaptchaServiceProxyImpl 类
Java代码
package cn.hxex.order.core.jcaptcha;  
 
import com.octo.captcha.service.CaptchaService;  
import com.octo.captcha.service.CaptchaServiceException;  
import org.acegisecurity.captcha.CaptchaServiceProxy;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
 
/** 
* 实现 CaptchaServiceProxy 用于acegi来校验,由spring注入jcaptchaService 
*  
* @author sshwsfc@gmail.com 
*/ 
public class JCaptchaServiceProxyImpl implements CaptchaServiceProxy {  
  /** 
   * Log for the class 
   */ 
  protected static Log log = LogFactory.getLog(JCaptchaServiceProxyImpl.class);  
  /** 
   * instance of CaptchaService. 
   */ 
  private CaptchaService jcaptchaService;  
    
  /** 
   * @see {@link CaptchaServiceProxy#validateReponseForId(String, Object)} 
   */ 
  public boolean validateReponseForId(String id, Object response) {  
    log.debug("validating captcha response");  
 
    try {  
      boolean isHuman = jcaptchaService.validateResponseForID(id, response)  
          .booleanValue();  
      if (isHuman) {  
        log.debug("captcha passed");  
      } else {  
        log.warn("captcha failed");  
      }  
      return isHuman;  
 
    } catch (CaptchaServiceException cse) {  
      // fixes known bug in JCaptcha  
      log.warn("captcha validation failed due to exception", cse);  
      return false;  
    }  
  }  
 
  public void setJcaptchaService(CaptchaService jcaptchaService) {  
    this.jcaptchaService = jcaptchaService;  
  }  

分享到:
评论

相关推荐

    获取验证码图片,不是识别验证码!

    获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是...

    js验证码验证码插件,简单易用、图片验证码,附demo

    验证码是网络安全领域中的一种常见机制,用于防止自动化程序(如机器人)进行非法操作,例如恶意注册、刷票等。在Web开发中,JavaScript验证码插件是实现这一功能的便捷工具,尤其对于前端开发者来说,它们提供了...

    验证码破解的方法,简单验证码破解java示例

    验证码是网络安全领域中的一种常见机制,用于防止自动化程序(如机器人)进行非法操作,例如注册、登录或提交表单。本篇文章将详细讨论验证码的基本原理,以及如何使用Java实现简单的验证码破解方法。请注意,了解...

    ASP验证码-非常优秀的ASP随机验证码

    看很多人都在找asp 验证码 asp 随机验证 我收集了四个非常优秀的ASP随机验证码,非常好用,分别为: Asp纯数字随机验证码程序 (5.98 kb) Asp数字及字母组合验证码程序(5.98 kb) Asp纯字母验证码程序.zip (5.98 kb ...

    生成验证码(带详细注释、Servlet已获取生成的验证码和输入的验证码)

    验证码是Web应用中常见的一种安全机制,用于防止自动化的机器人或者恶意软件进行非法操作,比如注册、登录等。本项目提供了生成验证码的功能,并且在Java后台处理了验证码的验证过程,确保用户输入的验证码与系统...

    gif动态登录验证码

    在网络安全领域,登录验证码是一种广泛使用的安全机制,用于防止恶意自动化程序(如机器人)未经授权地访问或操作用户账户。本文将深入探讨“gif动态登录验证码”这一特定的技术,以及它如何增强网站的安全性。 ...

    一个低调的行为验证码 [滑块验证码、点选验证码、行为验证码、旋转验证码, 滑动验证码].zip

    本资料主要探讨了四种类型的行为验证码:滑块验证码、点选验证码、行为验证码以及旋转验证码,特别是滑动验证码。 1. **滑块验证码**:滑块验证码是目前常见的验证码形式,用户需要将一个滑块拖动到正确的位置以...

    layUI的验证码功能及校验实例

    在实际部署中,开发者需要注意防刷机制,如验证码的刷新频率不宜过高,以免给正常用户带来不便,同时也可以加入验证码刷新的按钮,允许用户在看不清楚时刷新验证码。 最后,文件内容强调了layUI的验证码实现是使用...

    基于python实现破解滑动验证码过程解析

    今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案...

    .net 复杂的验证码

    在.NET开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、频繁登录等。创建一个复杂的验证码可以提高网站的安全性,减少非法攻击的可能性。本教程将详细介绍如何在.NET中...

    验证码反爬-超级鹰打码平台-验证码点选、验证码滑动资源

    在网络安全和反爬虫技术领域,验证码是一种常用的方法,用于防止自动化的机器人程序对网站进行恶意操作,如数据抓取或滥用服务。本资源包针对验证码反爬提供了相关的工具和资料,主要涉及到“超级鹰打码平台”以及...

    Android验证码的实现

    在Android应用开发中,验证码(CAPTCHA)是一种重要的安全机制,用于验证用户是人类而非自动程序。本篇文章将深入探讨如何在Android平台上实现验证码功能,包括自定义控件的创建和验证码的生成与验证。 首先,...

    验证码识别 汉字验证码识别

    验证码识别技术是网络安全中一种常见的身份验证手段,用于防止恶意自动化程序(如机器人)进行非法操作。汉字验证码识别尤其具有挑战性,因为它涉及到中文字符的多样性以及图像处理的复杂性。下面将详细介绍图像分割...

    安卓发送验证码倒计时效果和自动获取验证码并填充

    在安卓应用开发中,"安卓发送验证码倒计时效果和自动获取验证码并填充"是一个常见的功能,主要用于用户注册、登录或修改重要信息时的身份验证。这个功能涉及到多个关键知识点,包括网络请求、短信监听、UI更新以及...

    ASP.NET动态验证码

    ASP.NET动态验证码是一种用于验证用户身份的安全机制,广泛应用于网页登录、注册和其他涉及用户交互的安全场景。它通过生成随机的图像和文字组合,要求用户在输入框中输入看到的字符,以此来防止自动化的机器人或者...

    和验证码相关的图片数据集

    和验证码相关的图片数据集 数据说明: ·图像:包含PNG格式的验证码图像的文件夹。 ·Labels:包含两列的CSV文件:image_filename和文本。imagefilename对应于CAPTCHA图像的文件名,text包含CAPTCHA中描述的字母数字文本...

    unity c#手机短信验证码登陆注册

    发送的验证码内容代码,已写好,直接添加按钮调用即可,无需营业执照,个人可用,无需任何资质,轻松实现短信验证码功能,无需理解底层原理,全部封装好,直接调用即可,已写中文注释,使用c#代码编写,可在任何支持...

    SSM实现登录验证码功能

    在这个“SSM实现登录验证码功能”的项目中,我们将探讨如何在SSM框架下添加验证码功能,以增强用户登录的安全性。 首先,验证码功能的基本目的是防止恶意自动化程序(如机器人或爬虫)进行非法操作,如频繁尝试登录...

    ajax验证码 验证码ajax 生成中文验证码

    在标题和描述中提到的“ajax验证码”和“生成中文验证码”是验证码技术的两个关键点,我们将详细探讨这两个概念。 首先,Ajax(Asynchronous JavaScript and XML)是一种网页开发技术,它允许网页在不刷新整个页面...

Global site tag (gtag.js) - Google Analytics