Kaptcha 和 JCaptcha 使用介紹和實例
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" />
測試結果
來自:http://tedhacker.top/2016/11/14/Kaptcha和JCaptcha使用介紹/
本文由用戶 LeilaniHodg 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!