- 浏览: 118847 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
Kevin_jiang2011:
能直接在,代码里面配置吗?
Spring+CXF配置HTTP代理访问Internet -
xbiji:
不能用啊!!!!!!!!!!!!!!!!!!!!!!1
JQuery获取页面高度,页面宽度,窗口高度,窗口宽度 -
ben_liang:
# <http-conf:proxyAuthoriza ...
Spring+CXF配置HTTP代理访问Internet -
navy0168:
package com;import java.io. ...
解压缩
转自: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;
}
}
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;
}
}
发表评论
-
Java网站
2010-12-11 02:15 710转自:http://txxm.iteye.com/blog/5 ... -
一些反射常用的工具类
2010-09-17 13:59 1669拷贝属性: 1.org.apache.commons.bean ... -
Java安全管理器
2010-08-17 11:00 1634转:http://yuanyong.iteye.com ... -
jenlp110 的 一道面试题
2010-07-28 14:01 883转自:http://www.iteye.com/topic/5 ... -
Web前端开发性能优化
2010-07-28 11:01 958参考资料:http://developer.yahoo.com ... -
比较java写text文件的性能
2010-07-20 11:13 1013转自:http://hi.baidu.com/shmily_s ... -
dom4j读取xml:转http://shaqiang32.javaeye.com/blog/246539
2010-06-25 16:52 883SAXReader reader = new SAXRea ... -
反射-调用有参数和无参数的方法
2010-06-19 13:48 9115package com.cn.service; /** ... -
excel导出2
2010-02-05 12:37 906使用POI生成Excel文件,可以自动调整excel列宽等 ... -
多线程-条件变量: 转自:http://huanyue.javaeye.com/blog/560975
2010-01-14 17:56 692条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量 ... -
多线程交互-障碍器 转自:http://huanyue.javaeye.com/blog/560978
2010-01-14 17:24 793Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一 ... -
线程交互-转自:http://huanyue.javaeye.com/blog/560904
2010-01-14 17:13 901一、线程交互的基础知识 SCJP所要求的线程交互知识点需要 ... -
递归计算向非递归计算转换模板-转自http://mingliangfeng.javaeye.com/blog/201084
2010-01-14 13:36 881最近由于工作上的需要,研究了一下递归计算向非递归计算的转换问题 ... -
excel 导出
2010-01-11 15:06 1140public static InputStream Expor ...
相关推荐
获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是...
验证码是网络安全领域中的一种常见机制,用于防止自动化程序(如机器人)进行非法操作,例如恶意注册、刷票等。在Web开发中,JavaScript验证码插件是实现这一功能的便捷工具,尤其对于前端开发者来说,它们提供了...
验证码是网络安全领域中的一种常见机制,用于防止自动化程序(如机器人)进行非法操作,例如注册、登录或提交表单。本篇文章将详细讨论验证码的基本原理,以及如何使用Java实现简单的验证码破解方法。请注意,了解...
看很多人都在找asp 验证码 asp 随机验证 我收集了四个非常优秀的ASP随机验证码,非常好用,分别为: Asp纯数字随机验证码程序 (5.98 kb) Asp数字及字母组合验证码程序(5.98 kb) Asp纯字母验证码程序.zip (5.98 kb ...
验证码是Web应用中常见的一种安全机制,用于防止自动化的机器人或者恶意软件进行非法操作,比如注册、登录等。本项目提供了生成验证码的功能,并且在Java后台处理了验证码的验证过程,确保用户输入的验证码与系统...
在网络安全领域,登录验证码是一种广泛使用的安全机制,用于防止恶意自动化程序(如机器人)未经授权地访问或操作用户账户。本文将深入探讨“gif动态登录验证码”这一特定的技术,以及它如何增强网站的安全性。 ...
本资料主要探讨了四种类型的行为验证码:滑块验证码、点选验证码、行为验证码以及旋转验证码,特别是滑动验证码。 1. **滑块验证码**:滑块验证码是目前常见的验证码形式,用户需要将一个滑块拖动到正确的位置以...
在实际部署中,开发者需要注意防刷机制,如验证码的刷新频率不宜过高,以免给正常用户带来不便,同时也可以加入验证码刷新的按钮,允许用户在看不清楚时刷新验证码。 最后,文件内容强调了layUI的验证码实现是使用...
今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案...
在.NET开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、频繁登录等。创建一个复杂的验证码可以提高网站的安全性,减少非法攻击的可能性。本教程将详细介绍如何在.NET中...
在网络安全和反爬虫技术领域,验证码是一种常用的方法,用于防止自动化的机器人程序对网站进行恶意操作,如数据抓取或滥用服务。本资源包针对验证码反爬提供了相关的工具和资料,主要涉及到“超级鹰打码平台”以及...
在Android应用开发中,验证码(CAPTCHA)是一种重要的安全机制,用于验证用户是人类而非自动程序。本篇文章将深入探讨如何在Android平台上实现验证码功能,包括自定义控件的创建和验证码的生成与验证。 首先,...
验证码识别技术是网络安全中一种常见的身份验证手段,用于防止恶意自动化程序(如机器人)进行非法操作。汉字验证码识别尤其具有挑战性,因为它涉及到中文字符的多样性以及图像处理的复杂性。下面将详细介绍图像分割...
在安卓应用开发中,"安卓发送验证码倒计时效果和自动获取验证码并填充"是一个常见的功能,主要用于用户注册、登录或修改重要信息时的身份验证。这个功能涉及到多个关键知识点,包括网络请求、短信监听、UI更新以及...
ASP.NET动态验证码是一种用于验证用户身份的安全机制,广泛应用于网页登录、注册和其他涉及用户交互的安全场景。它通过生成随机的图像和文字组合,要求用户在输入框中输入看到的字符,以此来防止自动化的机器人或者...
和验证码相关的图片数据集 数据说明: ·图像:包含PNG格式的验证码图像的文件夹。 ·Labels:包含两列的CSV文件:image_filename和文本。imagefilename对应于CAPTCHA图像的文件名,text包含CAPTCHA中描述的字母数字文本...
发送的验证码内容代码,已写好,直接添加按钮调用即可,无需营业执照,个人可用,无需任何资质,轻松实现短信验证码功能,无需理解底层原理,全部封装好,直接调用即可,已写中文注释,使用c#代码编写,可在任何支持...
在这个“SSM实现登录验证码功能”的项目中,我们将探讨如何在SSM框架下添加验证码功能,以增强用户登录的安全性。 首先,验证码功能的基本目的是防止恶意自动化程序(如机器人或爬虫)进行非法操作,如频繁尝试登录...
在标题和描述中提到的“ajax验证码”和“生成中文验证码”是验证码技术的两个关键点,我们将详细探讨这两个概念。 首先,Ajax(Asynchronous JavaScript and XML)是一种网页开发技术,它允许网页在不刷新整个页面...