Kaptcha 和 JCaptcha 使用介紹和實例

LeilaniHodg 8年前發布 | 103K 次閱讀 開源 Spring 商業智能 驗證碼(Captcha)

Kaptcha 是一個非常實用的驗證碼生成工具,它是基于SimpleCaptcha的開源項目。通過調整Kaptcha配置可以生成各種樣式的驗證碼。

使用Kaptcha可以方便的配置以下細節:

  • 驗證碼的字體
  • 驗證碼字體的大小
  • 驗證碼字體的字體顏色
  • 驗證碼內容的范圍
  • 驗證碼圖片的大小,邊框,邊框粗細,邊框顏色
  • 驗證碼的干擾線
  • 驗證碼的樣式

JCaptcha簡介

JCapthca是一個開源的用來生成圖形驗證碼的Java開源組件,它非常強大,不光是可以生成圖片式的驗證碼,還可以生成聲音式的。

JCaptcha是CAPTCHA里面的一個比較著名的項目。

Kaptcha測試實例

添加依賴包

在pom.xml文件中新增dependency

<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>

配置applicationContext.xml

<beanid="captchaProducer"class="com.google.code.kaptcha.impl.DefaultKaptcha">
<propertyname="config">
<beanclass="com.google.code.kaptcha.util.Config">
<constructor-arg>
<props>
<propkey="kaptcha.border">yes</prop>
<propkey="kaptcha.border.color">105,179,90</prop>
<propkey="kaptcha.textproducer.font.color">blue</prop>
<propkey="kaptcha.image.width">80</prop>
<propkey="kaptcha.image.height">30</prop>
<propkey="kaptcha.textproducer.font.size">27</prop>
<propkey="kaptcha.session.key">code</prop>
<propkey="kaptcha.textproducer.char.length">4</prop>
<propkey="kaptcha.textproducer.font.names">宋體,楷體,微軟雅黑</prop>
<propkey="kaptcha.textproducer.char.string">123456789ABCE</prop>
<propkey="kaptcha.obscurificator.impl">com.google.code.kaptcha.impl.WaterRipple</prop>
<propkey="kaptcha.noise.color">white</prop>
<propkey="kaptcha.noise.impl">com.google.code.kaptcha.impl.NoNoise</prop>
<propkey="kaptcha.background.clear.from">white</prop>
<propkey="kaptcha.background.clear.to">white</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>

Controller實現

importcom.google.code.kaptcha.Constants;
importcom.google.code.kaptcha.Producer;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;

importjavax.annotation.Resource;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.awt.image.BufferedImage;
importjava.util.Random;

@Controller
@RequestMapping("/code")
publicclassCaptchaController{

@Resource
privateProducer captchaProducer;

@ResponseBody
@RequestMapping(value ="/captchaImage")
publicvoidgetKaptchaImage(HttpServletRequest request,HttpServletResponse response)throwsException{
 response.setDateHeader("Expires",0);
 response.setHeader("Cache-Control","no-cache, must-revalidate");
 response.addHeader("Cache-Control","post-check=0, pre-check=0");
 response.setHeader("Pragma","no-cache");
 response.setContentType("image/jpeg");

 String capText = captchaProducer.createText();// 生成驗證碼字符串

 Cookie cookie = newCookie(Constants.KAPTCHA_SESSION_KEY, capText);// 生成cookie
 cookie.setMaxAge(300);// 300秒生存期

 response.addCookie(cookie); // 將cookie加入response

 BufferedImage bi = captchaProducer.createImage(capText);// 生成驗證碼圖片
 ServletOutputStream out = response.getOutputStream();
 ImageIO.write(bi, "jpg", out);
try{
 out.flush();
 } finally{
 out.close();
 }

return;
 }

privateStringgetRandomString(intlength){
 String base = "abcdefghijklmnopqrstuvwxyz0123456789";
 Random random = newRandom();
 StringBuilder sb = newStringBuilder(length +1);
for(inti =0; i < length; ++i) {
intnumber = random.nextInt(base.length());
 sb.append(base.charAt(number));
 }
returnsb.toString();
 }
}

前端代碼

<imgid="verify"width="80"height="30"src="/code/captchaImage"/>

測試結果

Kaptcha可配置項

配置項 描述 默認值 可選值
kaptcha.border 是否有邊框 默認為yes yes,no
kaptcha.border.color 邊框顏色 默認為Color.BLACK  
kaptcha.border.thickness 邊框粗細度 默認為1  
kaptcha.producer.impl 驗證碼生成器 默認為DefaultKaptcha  
kaptcha.textproducer.impl 驗證碼文本生成器 默認為DefaultTextCreator  
kaptcha.textproducer.char.string 驗證碼文本字符內容范圍    
kaptcha.textproducer.char.length 驗證碼文本字符長度 默認為5  
kaptcha.textproducer.font.names 驗證碼文本字體樣式    
kaptcha.textproducer.font.size 驗證碼文本字符大小 默認為40  
kaptcha.textproducer.font.color 驗證碼文本字符顏色 默認為Color.BLACK  
kaptcha.textproducer.char.space 驗證碼文本字符間距 默認為2  
kaptcha.noise.impl 驗證碼噪點生成對象 默認為DefaultNoise  
kaptcha.noise.color 驗證碼噪點顏色 默認為Color.BLACK  
kaptcha.obscurificator.impl 驗證碼樣式引擎 默認為WaterRipple  
kaptcha.word.impl 驗證碼文本字符渲染 默認為DefaultWordRenderer  
kaptcha.background.impl 驗證碼背景生成器 默認為DefaultBackground  
kaptcha.background.clear.from 驗證碼背景顏色漸進 默認為Color.LIGHT_GRAY  
kaptcha.background.clear.to 驗證碼背景顏色漸進 默認為Color.WHITE  
kaptcha.image.width 驗證碼圖片寬度 默認為200  
kaptcha.image.height 驗證碼圖片高度 默認為50

圖片樣式:

水紋 com.google.code.kaptcha.impl.WaterRipple

魚眼 com.google.code.kaptcha.impl.FishEyeGimpy

陰影 com.google.code.kaptcha.impl.ShadowGimpy

JCaptcha測試實例

添加依賴包

<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha-all</artifactId>
<version>1.0-RC6</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>

注意:如果是Spring項目,必須加上exclusion,不然會提示BeanDefinitionParsingException錯誤。

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate NamespaceHandler for namespace 

Service實現

JCaptcha建議使用單例提供服務。

importcom.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
importcom.octo.captcha.component.image.color.SingleColorGenerator;
importcom.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
importcom.octo.captcha.component.image.textpaster.NonLinearTextPaster;
importcom.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
importcom.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
importcom.octo.captcha.engine.GenericCaptchaEngine;
importcom.octo.captcha.image.gimpy.GimpyFactory;
importcom.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
importcom.octo.captcha.service.image.DefaultManageableImageCaptchaService;
importcom.octo.captcha.service.image.ImageCaptchaService;

importjava.awt.*;

publicclassCaptchaService{
privatestaticclassSingletonHolder{
privatestaticImageCaptchaService imageCaptchaService =newDefaultManageableImageCaptchaService(
newFastHashMapCaptchaStore(),
newGenericCaptchaEngine(
newGimpyFactory[]{newGimpyFactory(
newRandomWordGenerator("123456789ABCE"),
newComposedWordToImage(
newRandomFontGenerator(20,20,newFont[]{newFont("Arial",20,20)}),
newGradientBackgroundGenerator(90,30,newSingleColorGenerator(newColor(235,255,255)),newSingleColorGenerator(newColor(255,195,230))),
newNonLinearTextPaster(4,4,newColor(11,11,11))
 )
 )}
 ),
180,
180000,
20000
 );
 }
privateCaptchaService(){}
publicstaticImageCaptchaServicegetInstance(){
returnSingletonHolder.imageCaptchaService;
 }
}

Controller實現

importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;

importjavax.imageio.ImageIO;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.awt.image.BufferedImage;

@Controller
@RequestMapping("/code")
publicclassCaptchaController{

@ResponseBody
@RequestMapping(value ="/captchaImage")
publicvoidgetJCaptchaImage(HttpServletRequest request,HttpServletResponse response)throwsException{
 response.setDateHeader("Expires",0);
 response.setHeader("Cache-Control","no-cache, must-revalidate");
 response.addHeader("Cache-Control","post-check=0, pre-check=0");
 response.setHeader("Pragma","no-cache");
 response.setContentType("image/jpeg");
 BufferedImage bi = CaptchaService.getInstance().getImageChallengeForID(request.getSession(true)
 .getId());
 ServletOutputStream out = response.getOutputStream();
 ImageIO.write(bi, "jpg", out);
try{
 out.flush();
 } finally{
 out.close();
 }
return;
 }

@ResponseBody
@RequestMapping(value ="/validate")
publicBooleanlogin(String username, String password, String captcha, HttpServletRequest request){
 Boolean result = false;
 Boolean isCaptchaCorrect = CaptchaService.getInstance().validateResponseForID(request.getSession().getId(), captcha);
if(isCaptchaCorrect) {

 }
returnresult;
 }
}

前端代碼

<img id="verify" width="80" height="30" src="/code/captchaImage" />

測試結果

Kaptcha 和 JCaptcha 使用介紹和實例

來自:http://tedhacker.top/2016/11/14/Kaptcha和JCaptcha使用介紹/

 

 本文由用戶 LeilaniHodg 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!